我们公司正在将我们的帮助系统迁移到Flare下的HTML5格式。我们还在URI命令行上使用Flare CSHID添加了对帮助系统的基于主题的访问,以便直接访问该主题,例如index.html#CSHID = GettingStarted以启动GettingStarted.html帮助页面。
我们的应用程序是用C ++编写的,并利用Win32 ShellExecute()函数生成与HTTP关联的默认应用程序以显示帮助系统。我们注意到ShellExecute()在没有指定主题标签时工作正常,例如
的ShellExecute(NULL,_T("开&#34),_ T(" C:\帮助\的index.html&#34),NULL,NULL,SW_SHOWNORMAL);
此功能将启动与查看HTML页面相关联的默认浏览器,在这种情况下,File:///协议处理程序将启动,浏览器将启动,您将看到file:/// c:/ Help /地址栏中的index.html。
但是,一旦为主题添加#信息,ShellExecute()就无法打开页面
的ShellExecute(NULL,_T(&#34;开&#34),_ T(&#34; C:\帮助\的index.html#cshid = GettingStarted&#34),NULL,NULL,SW_SHOWNORMAL); < / p>
如果浏览器完全打开,您将被定向到file:/// c:/Help/index.html而没有#cshid = GettingStarted主题标识。
请注意,如果文件协议处理程序通过ShellExecute()启用,如果帮助系统在Web上存在,并且Http或Https协议处理程序处于启用状态,那么这一切都很有效。
对于我们的客户,其中一些人在私人局域网上,我们不能总是依赖互联网访问,因此我们的帮助系统必须随应用程序一起提供。
答案 0 :(得分:3)
在与Microsoft的MSDN团队进行一些反复讨论之后,他们检查了ShellExecute()调用的源代码,并确定是,在ShellExecute()中处理基于File:///的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 ++代码有更多的了解,但这种通用设计对我们有用。
答案 1 :(得分:0)
我尝试过WebDrive的解决方案,但它在Windows 10上并没有真正起作用。
&#34; HTTP \壳牌\打开\命令&#34;默认值设置为Internet Explorer路径,无论我的默认浏览器设置如何。但是,对于Internet Explorer,该解决方案可以正常工作。
在Windows 10上获取默认浏览器路径的过程略有不同(How to determine the Windows default browser (at the top of the start menu)),但即使这样,解决方案也不能保证可以正常工作,具体取决于浏览器。例如。对我而言,它并没有与Edge合作。
要让它与Edge配合使用,我必须添加&#34; file:///&#34;到URL - 但这也使URL与ShellExecute()一起使用。所以,至少在Windows 10上,我需要做的就是:
的ShellExecute(NULL,_T(&#34;开&#34),_T(&#34;文件:/// C:/Help/Default.html#cshid=1648"),NULL,NULL ,NULL);
更新: 以上几个月前停止了工作。我最终做的是通过临时文件,如下所述:https://forums.madcapsoftware.com/viewtopic.php?f=9&t=28376#p130613
答案 2 :(得分:0)
使用FindExecutable()获取默认浏览器,并将完整的帮助文件路径及其查询(?
和片段(#
)作为lpParameters
参数传递给{ {3}}。他们不会在那里被剥夺。
然后,如果它是商店应用程序(最有可能是Microsoft Edge),则进行处理。
伪C代码:
if (FindExecutable(_T("c:\Help\index.html"), NULL, szBrowser)
{
if (szBrowser == _T("C:\WINDOWS\system32\LaunchWinApp.exe"))
{
// default browser is a Windows Store App
szBrowser = _T("shell:AppsFolder\Microsoft.MicrosoftEdge_8wekyb3d8bbwe!MicrosoftEdge");
}
}
else
{
szBrowser = szURL;
szURL = NULL;
}
ShellExecute(NULL, NULL, szBrowser, szURL, NULL, SW_SHOWNORMAL);
答案 3 :(得分:0)
我在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);