대부분 기본 브라우저를 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);
}