gpt4 book ai didi

http - 本地 html 或文件 URL 的 ShellExecute 失败

转载 作者:可可西里 更新时间:2023-11-01 15:27:41 26 4
gpt4 key购买 nike

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

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

ShellExecute(NULL, _T("open"), _T("c:\\Help\\index.html"), NULL, NULL, SW_SHOWNORMAL);

此函数将启动与查看 HTML 页面关联的默认浏览器,在这种情况下,File:/// 协议(protocol)处理程序将启动,浏览器将启动,您将看到 地址栏中的 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.html 而没有 #cshid=GettingStarted主题识别。

请注意,如果通过 ShellExecute() 使用文件协议(protocol)处理程序,这只是一个问题,如果帮助系统存在于网络上,并且使用了 Http 或 Https 协议(protocol)处理程序,则一切效果很好。

对于我们的客户,其中一些客户使用私有(private) LAN,我们不能总是依赖 Internet 访问,因此我们的帮助系统必须随应用程序一起提供。

最佳答案

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

解决方案是通过在 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++ 代码还有更多内容,但这种通用设计对我们很有效。

关于http - 本地 html 或文件 URL 的 ShellExecute 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26305322/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com