在 Win7 + VS2008 (Unicode 字符集) 環境下,標準寫法:
ShellExecute(NULL, L"open", L"https://www.hao123.com", NULL, NULL, SW_SHOWNORMAL);
運行時報錯或無反應。
ShellExecute 宏展開為 ShellExecuteW,參數需寬字符串 (L"...")。ShellExecuteW 對 URL 協議處理有已知 Bug:若 lpFile 為 URL,且系統默認瀏覽器非 IE,可能失敗。lpFile=L"IEXPLORE", lpParameters=URL,強制用 IE 打開,用戶體驗極差。
ShellExecute(NULL, L"open", L"Explorer.exe", L"https://www.hao123.com", NULL, SW_SHOWMAXIMIZED);
原理:Windows Shell 的 Explorer.exe 負責處理 URL 協議關聯,會自動調用系統默認瀏覽器(Chrome/Firefox/Edge 等),完美解決「默認瀏覽器」問題。
HINSTANCE ShellExecute(
HWND hwnd, // 父窗口句柄,無則 NULL
LPCTSTR lpOperation, // 操作動詞:"open", "print", "edit", "explore" 等
LPCTSTR lpFile, // 文件/URL/可執行文件路徑
LPCTSTR lpParameters,// 參數 (lpFile 為可執行文件時)
LPCTSTR lpDirectory, // 默認工作目錄
INT nShowCmd // 顯示方式:SW_SHOWNORMAL, SW_SHOWMAXIMIZED, SW_HIDE 等
);
bool OpenUrlInDefaultBrowser(const wchar_t* url) {
if (!url || !*url) return false;
HINSTANCE h = ShellExecute(NULL, L"open", L"Explorer.exe", url, NULL, SW_SHOWNORMAL);
return (reinterpret_cast(h) > 32); // >32 表示成功
}
// 用法
OpenUrlInDefaultBrowser(L"https://www.google.com");
ShellExecute(NULL, L"open", L"explorer.exe", L"/select, C:\\path\\file.txt", NULL, SW_SHOWNORMAL);ShellExecute(NULL, L"open", L"mailto:test@example.com", NULL, NULL, SW_SHOWNORMAL);lpOperation = L"runas" (需 UAC 提權)。Unicode 環境下打開 URL,**請使用 Explorer.exe 作為 lpFile,URL 作為 lpParameters**,而非直接傳 URL 或強制指定瀏覽器可執行文件。這是最兼容、最符合用戶習慣、最穩健的方案。