본문 바로가기

프로그래밍/코드 조각

기본 브라우저로 URL 실행

대부분 기본 브라우저를 HKEY_CLASSES_ROOT 하위의

http\shell\open\command 에서 읽어와서 처리하는 경우가 대부분이었지만

비스타에서는 이곳에 값을 쓰기 위해 권한 상승이 불가피하기 때문에 대부분의 웹브라우저들은

다른 방법으로 우회하여 처리하고 있다.

이를 일일이 찾아서 처리하는 방식 대신 WINAPI 함수인 FindExecutable() 함수를 사용하여

기본 브라우저 패스를 얻어 올 수 있다.


    bool ExecuteDefaultWebBrowser(HWND hwnd, LPCTSTR url)
    {
        TCHAR tempFolder[MAX_PATH] = {0,};
        if(GetTempPath(_countof(tempFolder), tempFolder) == 0) {
            // Temp 폴더를 얻어오는데 실패
            _tcscpy_s(tempFolder, _countof(tempFolder), _T("C:\\"));
        }
        TCHAR tempFile[MAX_PATH] = {0,};
        if(GetTempFileName(tempFolder, _T("EST"), GetTickCount(), tempFile) == 0) {
            // Temp 파일명 생성 실패
            // 단순 4자리 HEX 코드 생성
            _stprintf_s(tempFile, _countof(tempFile), _T("%sTMP%x.tmp"), tempFolder, GetTickCount()%0x10000);
        }
        tstring tempHtml(tempFile);
        tempHtml.append(_T(".html"));
        HANDLE file = CreateFile(tempHtml.c_str(), GENERIC_ALL, 0, NULL, CREATE_NEW, FILE_FLAG_DELETE_ON_CLOSE, NULL);
        TCHAR browserName[MAX_PATH] = {0,};
        if(FindExecutable(tempHtml.c_str(), NULL, browserName) < (HINSTANCE)32) {
            ZeroMemory(browserName, sizeof(browserName));
            _tcscpy_s(browserName, _countof(browserName), _T("explorer.exe"));
        }
        CloseHandle(file);

        TCHAR tempUrl[MAX_PATH] = {0,};
        _tcscpy_s(tempUrl, _countof(tempUrl), url);
        PathQuoteSpaces(tempUrl);
        HINSTANCE ret = ShellExecute(hwnd, _T("open"), browserName, tempUrl, NULL, SW_SHOWNORMAL);
        return (ret >= (HINSTANCE)32);
    }