Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net Google Chrome破坏了ShellExecute()?_.net_Google Chrome_Shellexecute - Fatal编程技术网

.net Google Chrome破坏了ShellExecute()?

.net Google Chrome破坏了ShellExecute()?,.net,google-chrome,shellexecute,.net,Google Chrome,Shellexecute,多年来,我一直在使用ShellExecute()API从应用程序中启动默认的web浏览器。像这样: ShellExecute( hwnd, _T("open"), _T("http://www.winability.com/home/"), NULL, NULL, SW_NORMAL ); 直到几周前,谷歌发布了Chrome浏览器,它一直工作正常。现在,如果计算机上安装了Chrome,ShellExecuteAPI将不再打开网页 有人知道如何解决这个问题了吗?(没有检测到C

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

ShellExecute( hwnd, _T("open"), 
    _T("http://www.winability.com/home/"), 
    NULL, NULL, SW_NORMAL );
直到几周前,谷歌发布了Chrome浏览器,它一直工作正常。现在,如果计算机上安装了Chrome,ShellExecuteAPI将不再打开网页

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


编辑:Sergey提供的代码似乎有效,所以我接受它作为“答案”。除了我不喜欢调用WinExec:MSDN之外,我认为提供WinExec只是为了与16位应用程序兼容。注意,它可能会停止与任何Service Pack一起工作。我没有尝试过,但如果它已经停止使用Windowsx64,我也不会感到惊讶,因为它根本不支持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;
}
HINSTANCE-GotoURL(LPCTSTR-url,int-showcmd)
{
TCHAR键[最大路径+最大路径];
//首先尝试ShellExecute()
HINSTANCE结果=0;
CString strURL=url;

如果(strURL.Find(“.htm”)在听到关于ShellExecute在少数系统上失败的报告后,我实现了一个类似于Sergey Kornilov给出的示例的函数。这大约是一年前的事了。同样的前提是-对.htm文件处理程序进行直接HKCR查找

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


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

FWIW,这在我的机器上非常有效,Chrome设置为默认浏览器。您可能想看看在坏掉的机器上是否安装了其他东西……它在我的机器上不起作用,但有启动的技巧与.htm相关的应用程序现在可以运行了,所以我很高兴。谢谢!WinExec实际上仍然在x64中,一直到当前的Windows afaik,并且已经过测试。我不相信他们有很好的理由删除它,所以就把它留在了。我感觉这可能与在后台选项卡中打开Chrome链接有关。也许用户没有注意到,或者这个标签被错误地隐藏了。根据稀疏的用户报告,Opera似乎也受到了这个问题的困扰。我自己,我没有看到过这样的故障,所以相信根本原因是一些PC上严重的外壳关联损坏,假设不只是它们“丢失”正在打开的后台标签。另外请注意,正如我在回答的一条评论中所指出的,如果您的应用程序正在运行提升版,请小心启动提升版浏览器。这显然是浏览器的一种不希望出现的状态。当然,仅适用于NT6+。我可以同意,这里的前提似乎是最有效的,我必须做一些实验来详细说明rmine这样做。如果ShellExecute失败,则返回。请注意,您可以返回HTTP协议,而不是.HTM处理程序,但这正是ShellExecute应该做的,因此,如果更改代码以执行此操作,则可能会遇到二次失败。另外还有一个问题:在NT 6+中从提升的进程启动浏览器时,浏览器本身已提升启动。这是一种不希望出现的状态。有一些方法可以解决此问题,但不能解决此问题