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

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

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

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

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

有帮助吗?

解决方案

以下是适用于所有浏览器的代码。如果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;
}

其他提示

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top