2

多年来,我一直在使用 ShellExecute() API 从我的应用程序中启动默认的 Web 浏览器。像这样:

ShellExecute( hwnd, _T("open"), 
    _T("http://www.winability.com/home/"), 
    NULL, NULL, SW_NORMAL );

它一直运行良好,直到几周前谷歌发布了它的 Chrome 浏览器。现在,如果计算机上安装了 Chrome,ShellExecute API 将不再打开网页。

有没有人想出如何解决这个问题?(没有检测到 Chrome 并显示一条消息告诉用户这是 Chrome 的错?)

编辑:谢尔盖提供的代码似乎有效,所以我接受了它作为“答案”。除了我不喜欢对 WinExec 的调用:MSDN 读到 WinExec 只是为了与 16 位应用程序兼容而提供的。IOW,它可能会停止使用任何服务包。我没有尝试过,但如果它已经停止在 Windows x64 上工作,我不会感到惊讶,因为它根本不支持 16 位应用程序。因此,我将使用 ShellExecute 而不是 WinExec,它的路径与 Sergey 的代码一样从注册表中获取,并将 URL 作为参数。谢谢!

4

2 回答 2

4

这是适用于所有浏览器的代码。诀窍是在 ShellExecute 失败时调用 WinExec。

HINSTANCE GotoURL(LPCTSTR url, int showcmd)
{
    TCHAR key[MAX_PATH + MAX_PATH];

    // First try ShellExecute()
    HINSTANCE result = 0;

    CString strURL = url;

    if ( strURL.Find(".htm") <0 && strURL.Find("http") <0 )
        result = ShellExecute(NULL, _T("open"), url, NULL, NULL, showcmd);

    // If it failed, get the .htm regkey and lookup the program
    if ((UINT)result <= HINSTANCE_ERROR) {

        if (GetRegKey(HKEY_CLASSES_ROOT, _T(".htm"), key) == ERROR_SUCCESS) {
            lstrcat(key, _T("\\shell\\open\\command"));

            if (GetRegKey(HKEY_CLASSES_ROOT,key,key) == ERROR_SUCCESS) {
                TCHAR *pos;
                pos = _tcsstr(key, _T("\"%1\""));
                if (pos == NULL) {                     // No quotes found
                    pos = strstr(key, _T("%1"));       // Check for %1, without quotes
                    if (pos == NULL)                   // No parameter at all...
                        pos = key+lstrlen(key)-1;
                    else
                        *pos = '\0';                   // Remove the parameter
                }
                else
                    *pos = '\0';                       // Remove the parameter

                lstrcat(pos, _T(" \""));
                lstrcat(pos, url);
                lstrcat(pos, _T("\""));
                result = (HINSTANCE) WinExec(key,showcmd);
            }
        }
    }

    return result;
}
于 2008-09-21T21:17:31.803 回答
0

在听到 ShellExecute 在少数系统上失败的报告后,我实现了一个类似于 Sergey Kornilov 给出的示例的功能。这是大约一年前的事了。相同的前提 - 对 .HTM 文件处理程序进行直接 HKCR 查找。

然而,事实证明,有些用户拥有将自己注册到“打开”.htm 文件(而不是“编辑”它们)的编辑器(例如 UltraEdit)。因此,如果ShellExecute 失败,则此辅助方法在这些情况下也会失败。它会打开编辑器,正如 shell 协会错误地指示的那样。

因此,用户应该使用 HTTP 处理程序,或者至少优先使用 HTML 处理程序。

于 2012-07-14T08:51:55.237 回答