2014-10-10 67 views
2

我们公司正在将我们的帮助系统迁移到Flare下的HTML5格式。我们还在URI命令行上使用Flare CSHID's将基于主题的访问权限添加到帮助系统中,以便直接访问主题,例如index.html#CSHID = GettingStarted以启动GettingStarted.html帮助页面。对于本地html或文件URL,ShellExecute失败

我们的应用程序使用C++编写,并利用Win32 ShellExecute()函数生成与HTTP关联的默认应用程序以显示帮助系统。我们注意到ShellExecute()在没有指定哈希标签时工作正常,如

ShellExecute(NULL,_T(“open”),_ T(“c:\ Help \ index.html”),NULL,NULL ,SW_SHOWNORMAL);

此功能将启动与查看HTML页面相关的默认浏览器,在这种情况下,File:///协议处理程序将启动,浏览器将启动,您将看到file:/// c:/ Help /index.html在地址栏中。

然而,一旦你添加#信息主题,的ShellExecute()无法打开网页

的ShellExecute(NULL,_T( “开”),_ T(“C:\帮助\ index.html在#cshid = GettingStarted“),NULL,NULL,SW_SHOWNORMAL);

如果浏览器根本打开,那么您将被定向到file:/// c:/Help/index.html,而没有#cshid = GettingStarted主题标识。

请注意,如果通过ShellExecute()使用File协议处理程序,如果帮助系统停留在Web上,并且使用Http或Https协议处理程序,那么这一切都很好。

对于我们的客户,其中一些人在私人局域网中,我们不能总是依赖互联网访问,所以我们的帮助系统必须随应用程序一起提供。

回答

2

经过微软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++代码,但这种一般的设计对我们很有帮助。

相关问题