Http 本地html或文件URL的ShellExecute失败

Http 本地html或文件URL的ShellExecute失败,http,hashtag,shellexecute,flare,Http,Hashtag,Shellexecute,Flare,我们公司正在将帮助系统迁移到Flare下的HTML5格式。我们还使用URI命令行上的Flare CSHID添加了对帮助系统的基于主题的访问,用于直接访问主题,例如index.html#CSHID=GettingStarted,以启动GettingStarted.html帮助页面 我们的应用程序是用C++编写的,利用Win32 SHILL Excel()/Cux>函数生成与HTTP相关联的默认应用程序来显示帮助系统。我们注意到,ShellExecute()在未指定hashtag时工作正常,例如

我们公司正在将帮助系统迁移到Flare下的HTML5格式。我们还使用URI命令行上的Flare CSHID添加了对帮助系统的基于主题的访问,用于直接访问主题,例如
index.html#CSHID=GettingStarted
,以启动
GettingStarted.html
帮助页面

我们的应用程序是用C++编写的,利用Win32 <代码> SHILL Excel()/Cux>函数生成与HTTP相关联的默认应用程序来显示帮助系统。我们注意到,
ShellExecute()
在未指定hashtag时工作正常,例如

ShellExecute(NULL, _T("open"), _T("c:\\Help\\index.html"), NULL, NULL, SW_SHOWNORMAL);
此函数将启动与查看HTML页面相关的默认浏览器,在这种情况下,
文件://
协议处理程序将启动,浏览器将启动,您将看到
file:///c:/Help/index.html
在地址栏中

但是,一旦为主题添加了
#
信息,
ShellExecute()
将无法打开页面

ShellExecute(NULL,_T("open"),_T("c:\\Help\\index.html#cshid=GettingStarted"),NULL,NULL,SW_SHOWNORMAL);
如果浏览器完全打开,您将被定向到
file:///c:/Help/index.htm
l不带
#cshid=GettingStarted
主题标识

请注意,只有当文件协议处理程序通过
ShellExecute()
参与时,这才是一个问题;如果帮助系统位于web上,并且Http或Https协议处理程序参与,则一切正常


对于我们的客户(其中一些客户在专用局域网上),我们不能总是依赖Internet访问,因此我们的帮助系统必须随应用程序一起提供。

在与Microsoft的MSDN团队进行了多次交流后,他们审查了ShellExecute()调用的源代码,确定是,在ShellExecute()中处理基于文件:///的URL时,ShellExecute()调用将在启动默认浏览器并发送HTML页面以打开之前,删除#及其在#之后找到的任何数据。MS的立场是,他们故意这样做是为了防止注入函数

解决方案是通过在URL中搜索一个#来增强ShellExecute()调用,如果找到一个#,那么我们将使用该URL手动启动默认浏览器。这是伪代码

void WebDrive_ShellExecute(LPCTSTR szURL)
{
    if ( _tcschr(szURL,_T('#')) )
    {
        //
        //Get Default Browser from Registry, then launch it.
        //
        ::RegGetStr(HKCR,_T("HTTP\\Shell\\Open\\Command"),szBrowser);
        ::CreateProcess ( NULL, szBrowser + _T(" ") + szURL, NULL, NULL, FALSE, 0, NULL, NULL, &sui, &pi);
    }
    else
        ShellExecute(NULL,_T("open"),szURL,NULL,NULL,SW_SHOWNORMAL);
}

当然,C++代码还有一点,但是这个通用的设计对我们来说是有效的。

< P>我尝试了WebDRIVER的解决方案,它并没有真正在Windows 10上工作。 “HTTP\Shell\Open\Command”默认值设置为Internet Explorer路径,与我的默认浏览器设置无关。但是,对于Internet Explorer来说,该解决方案确实有效

在Windows 10上获取默认浏览器路径的过程有点不同(),但即使如此,根据浏览器的不同,解决方案也不能保证工作。对我来说,它对Edge不起作用

为了让它与Edge一起工作,我必须在URL中添加“file://”,但这也使URL与ShellExecute()一起工作。所以,至少在Windows 10上,我需要做的就是:

ShellExecute(空,_T(“打开”),_T(“file:///c:/Help/Default.html#cshid=1648)、空、空、空)

更新: 上述系统几个月前就停止工作了。我最终做的是遍历临时文件,如下所述:

用于获取默认浏览器,并将完整的帮助文件路径及其查询(
)和片段(
#
)作为
lpParameters
参数传递给。他们不会在那里脱光衣服。
如果是商店应用程序(很可能是Microsoft Edge),请处理该案例

伪C代码:

if(FindExecutable(_T(“c:\Help\index.html”),NULL,szBrowser)
{
如果(szBrowser==\T(“C:\WINDOWS\system32\LaunchWinApp.exe”))
{
//默认浏览器是Windows应用商店应用程序
szBrowser=_T(“shell:AppsFolder\Microsoft.MicrosoftEdge_8wekyb3d8bbwe!MicrosoftEdge”);
}
}
其他的
{
szBrowser=szURL;
szURL=NULL;
}
ShellExecute(NULL,NULL,szBrowser,szURL,NULL,SW_SHOWNORMAL);

我在Qt应用程序中没有使用除ShellExecute之外的任何方法就解决了这个问题

QString currentpath = QDir::currentPath();
QString url = "/help//html/index.html#current";
QString full_url = "file:///" + currentpath + url;
QByteArray full_url_arr= full_url.toLocal8Bit();
LPCSTR lp = LPCSTR(full_url_arr.constData());
ShellExecute(NULL, "open", lp, NULL, NULL, SW_SHOWNORMAL);


你确信<代码> SeLeXECudie<代码>是否使用了锚片段?我刚写了一个C++控制台应用程序,它打开到Debug .HTML,但正在删除它会接受URL的
#cshid=
部分吗?