ShellExecute 对于本地 html 或文件 URL 失败

2024-03-06

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

我们的应用程序是用 C++ 编写的,并利用 Win32ShellExecute()函数生成与 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("open"),_T("c:\\Help\\index.html#cshid=GettingStarted"),NULL,NULL,SW_SHOWNORMAL);

如果浏览器完全打开,您将被定向到file:///c:/Help/index.htm我没有#cshid=GettingStarted主题识别。

请注意,只有当文件协议处理程序通过以下方式参与时,这才是问题ShellExecute(),如果帮助系统存在于网络上,并且使用了 Http 或 Https 协议处理程序,则一切都运行良好。

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


经过与 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++ 代码还有更多内容,但这种总体设计对我们来说很有效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ShellExecute 对于本地 html 或文件 URL 失败 的相关文章

随机推荐

  • only_full_group_by模式有什么好处?

    我更新了mysql 从MySQL版本5 6 17升级到版本5 7 14 因为我的 sql 查询有错误 事实上 我的许多查询都是这样的 SELECT count id as nbr lic from prep WHERE key 18 我有这
  • C# 清除具有值类型的 List 仍然是 O(n) 操作吗?

    据微软称文档 https msdn microsoft com en us library dwb5h52a 28v vs 110 29 aspx 在 List 上调用 Clear 是一个 O n 操作 我猜这是因为如果列表要保存引用 则需
  • Flutter - 在一个屏幕上显示两个ListView

    我正在尝试添加水平线listView builder在另一个垂直的顶部listView builder Both listViews应该有text在两者之上 这是我到目前为止所做的仅顶部水平 listView builder is draw
  • django HttpResponse 和 unicode

    我使用 django 作为网络应用程序的后端 我通过 django 发送 json 数据 效果很好 然而最近我开始处理非 ASCII 数据并注意到非 ASCII 字符的一些异常行为 在我的网络应用程序中 我的代码如下所示 def make
  • 进行立即变量赋值

    我在使用 与使用 分配的变量相结合的 make 文件中立即分配变量时遇到问题 例如 VAR a VARS VAR rule1 echo VARS VAR b VARS VAR rule2 echo VARS 当我运行 make 时 无论规则
  • 动态类定义的酸洗

    我正在尝试将动态生成的类作为替代类的工厂 像下面这样 import sys pickle class BC object pass C type NewClassName BC pickle dump C sys stdout 这会导致以下
  • 谷歌地图 V3 JS 没有发生 UIWebView iOS 6(iPhone) 的“中心更改”

    我正在尝试显示GoogleMap Google maps V3 JS in UIWebView ios6 but 当我在网络视图中移动地图时 事件没有发生center changed 移动地图已完成 事件火 Why 有人告诉我页面 http
  • PHP使用时区函数的时差?

    我试图找到一种方法来使用 PHP 中的时区函数显示两个位置之间的时间差异 http php net manual en timezones php http php net manual en timezones php 假设我从上面的链接
  • Excel VBA - 运行时错误“9”,下标超出范围

    我真的很感谢我能得到的任何帮助 我试图循环遍历一列 查找重复的名称 然后从同一行获取该名称和其他几个数据 并将它们放入一个我想使用另一个函数的二维数组中 但它不起作用 我真的需要你的帮助来弄清楚为什么我不能在不保留数据的情况下重新调整这个数
  • Web 音频 API - 如何将音频缓冲区保存到包含所有更改的文件?

    我对音频缓冲区 例如增益和平移 进行了更改 并将它们连接到音频上下文 现在我想将所有已实施的更改保存到一个文件中 按原样保存缓冲区将为我提供未经更改的原始音频 有任何方法或程序可以做到这一点吗 方法是使用MediaRecorder保存修改后
  • java中继承私有字段

    如果子类不能从超类继承私有成员 但它从超类继承公共方法 这些方法可以访问未继承的私有成员 如此处所述 http docs oracle com javase tutorial java IandI subclasses html http
  • 无法找到 Microsoft 认知服务的订阅密钥

    I need to work on Microsoft Cognitive Services Face API I downloaded the code from https github com Microsoft Cognitive
  • CLARION 日期转换 C# + 日期加/减

    这是针对 ISV 数据库的 所以我对此进行了逆向工程并且无法更改 我如何在 C 中执行以下日期到 int visa versa 转换 所以说日期是 5 17 2012 它被转换为 int 77207 在数据库中 起初我以为这是儒略日期 但事
  • => 和 () => 在 Scala 中意味着什么[重复]

    这个问题在这里已经有答案了 我是 Scala 的新手 我真的很喜欢它 但有时它会让我感到惊讶 例如 clickedCallbacks List gt Unit 谁能告诉我什么 gt and gt 在斯卡拉中是什么意思 gt 是用于创建函数实
  • C# 和 SQL Server 中 int 到 guid 的不同转换

    在 C 和 SQL Server 中将 int 转换为 guid 时 我得到不同的值 在C 中我使用这个方法 public static Guid Int2Guid int value byte bytes new byte 16 BitC
  • Ant 无法删除 Windows 上的某些文件

    我有一个 ant 构建 可以创建目录 调用 javac 和所有常规内容 我遇到的问题是 当我尝试执行清理 删除生成的所有内容 时 删除任务报告无法删除某些文件 当我尝试手动删除它们时 效果很好 这些文件显然没有被任何其他进程打开 但 ant
  • 使用 CALayer 委托

    我有一个 UIView 其图层将有子图层 我想为每个子图层分配委托 因此委托方法可以告诉图层要绘制什么 我的问题是 作为 CALayer 的代表我应该提供什么 文档说不要使用图层所在的 UIView 因为这是为视图的主 CALayer 保留
  • 自定义控件中的选择器

    我正在建立一些表格 使用TableView 并注意到我对单元格的样式设置相同 我决定将这段重复的代码重构为一个公共控件 I am struggling to get the binding to work on the picker cor
  • 如何暂停在终端中运行的Python脚本

    我有一个网络爬行 python 脚本在终端中运行了几个小时 它不断填充我的数据库 它有几个嵌套的 for 循环 由于某些原因 我需要重新启动计算机并从我离开的位置继续执行脚本 是否可以保留指针状态并恢复之前在终端中运行的脚本 我正在寻找一种
  • ShellExecute 对于本地 html 或文件 URL 失败

    我们公司正在将我们的帮助系统迁移到 Flare 下的 HTML5 格式 我们还在 URI 命令行上使用 Flare CSHID 添加了对帮助系统的基于主题的访问 以便直接访问主题 例如index html CSHID GettingStar