首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >谷歌浏览器打破了ShellExecute()?

谷歌浏览器打破了ShellExecute()?
EN

Stack Overflow用户
提问于 2008-09-21 21:07:58
回答 2查看 3.4K关注 0票数 2

多年来,我一直使用ShellExecute()应用程序接口从我的应用程序中启动默认的web浏览器。如下所示:

代码语言:javascript
复制
ShellExecute( hwnd, _T("open"), 
    _T("http://www.winability.com/home/"), 
    NULL, NULL, SW_NORMAL );

它一直运行良好,直到几周前,谷歌发布了Chrome浏览器。现在,如果电脑上安装了Chrome,ShellExecute应用程序接口将不再打开网页。

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2008-09-21 21:17:32

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

代码语言:javascript
复制
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;
}
票数 4
EN

Stack Overflow用户

发布于 2012-07-14 16:51:55

在听到少数系统上ShellExecute失败的报告后,我实现了一个类似于谢尔盖·科尼洛夫给出的例子的函数。这是一年前的事了。同样的前提-对.HTM文件处理程序进行直接HKCR查找。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/112169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档