【问题标题】:Create WiX installer for ActiveX Object为 ActiveX 对象创建 WiX 安装程序
【发布时间】:2020-02-25 23:23:06
【问题描述】:

我使用 heat 生成了一个包含注册表项的文件,并在 Visual Studio 中创建了一个 wix 项目。我尝试将片段直接包含在 product.wxs 中,并将其作为组件组引用。当我执行安装程序时,没有任何反应。要测试是否正确添加了 ActiveX 对象,在 Internet Explorer 中,new ActiveXObject('<prog ID>') 应该可以工作,但不能。我猜注册表项是不够的。如何添加 ActiveX 对象创建的.dll 并确保 Internet Explorer 可以定位到 ActiveXObject?

根据我的评论:这是我正在尝试做的示例 repo。我创建了一个带有 COM 可见函数的类库。这有一个带有“ActiveXExample”的 ProgId,并且应该能够通过 WiX 创建的 ActiveXExampleInstaller .msi 安装到机器上。我运行安装程序,发现没有添加任何注册表项或文件。我很确定这是目录结构的问题,但我仍然不明白如何添加文件。 https://github.com/SvenWritesCode/ActiveXExample

【问题讨论】:

  • 这方面有什么更新吗?我对建议将核心 COM 对象标记为安全的脚本编写有点不太高兴。这确实是必须由安全人员运行的东西。 IE11 完全锁定是有充分理由的......
  • 这可能只是 x86 与 x64 的问题。我过于简单化了,但是如果您使用 32 位 IE,则必须将您的 COM 对象(ActiveX = COM)注册到 32 位注册表中,如果您使用 64 位 IE,您必须将您的 COM 对象注册到 64-位注册表,如果要同时使用两者,则必须在两个注册表中进行注册。 => 这可能只是意味着您必须构建两个 MSI:一个用于 x86 设置,一个用于 x64。
  • 64 位 MSI 文件可以安装 32 位和 64 位组件,但是这样的包不能在 x86 机器上运行。因此,如果您永远不需要在真正的 x86 机器上安装,您可以构建一个 MSI。请注意,WiX 在 x64 COM 文件方面存在一些问题(除非已修复 - 请参阅下面有关 WiX 和 COM 注册的链接)。
  • @SteinÅsmul 该应用程序目前用于无法访问 Internet 的本地 Intranet,因此即使将 FileSystemObject 标记为安全也可能会起作用,但仍然存在太大的安全风险。我的想法(如果我错了,请纠正我)是创建我自己的具有相同功能的 Active X 对象,然后能够将其安装到客户端计算机上,这将是一个更好的主意。
  • 我想这可能行得通,但我会使用 VB6 或 C++ 来制作真正的 COM 对象,而不是为 COM 互操作注册的 .NET 程序集?我不是该技术的专家,而且它基本上已经过时了,因为我重复了太多次:-)。

标签: visual-studio wix windows-installer activex


【解决方案1】:

总结1)IE 安全选项 中可能存在限制,阻止您的 ActiveX 控件从根本上跑。 2) 此外,控件的完全注册可能存在问题。

  • 以下是一些可帮助您调试的资源。
  • ActiveX 控件是否经过数字签名?
  • 能否在 IE 之外实例化控件?
  • 这是 64 位二进制文​​件吗?

请在下方发表评论,并在github.com 上提供样本?会回来查看的。


IE:现在 Internet Explorer 中的 Active X 趋于关闭?

  • 安装用于浏览器访问的 ActiveX 控件过去需要从 Web 服务器调用安装并从那里下载经过数字签名的安装程序。
  • 此处描述了从网站安装签名 ActiveX 控件的过程:Packaging ActiveX Controls with Wix MSI请阅读此链接答案 - 重要)。

  • 查看 Windows 10 测试盒上的 Internet Explorer,似乎实施了大量限制。这是一个插图(不是实际的 Windows 10 对话框):

COM 注册:与许多其他工具(商业)相比,使用 WiX 进行 COM 注册本身有点笨拙。以下是关于一些问题的文章:Registering COM EXE with WIXNote that 64-bit COM files are not properly handled by WiX(除非最近修复了)。

Heat.exe:听起来你已经用过了,但是运行 heat.exe 来获取文件的 COM 注册信息可以这样做:

heat.exe file MyCOMDll.dll -out MyCOMDll.wxs

MyCOMDll.wxs 文件必须以某种方式合并到您的主要 WiX 源中。我只是手动提取我需要的内容并注入主源。这需要一些经验,但并不难。 If there are problems, maybe your sources can be put on github.com perhaps? So we can take a look? 没有源头总是很难弄清楚。


链接

【讨论】:

  • 这是我正在尝试做的一个示例 repo。我创建了一个带有 COM 可见函数的类库。这有一个带有“ActiveXExample”的 ProgId,并且应该能够通过 WiX 创建的 ActiveXExampleInstaller .msi 安装到机器上。我运行安装程序,发现没有添加任何注册表项或文件。我很确定这是目录结构的问题,但我仍然不明白如何添加文件。 github.com/SvenWritesCode/ActiveXExample
  • 这个场景是什么?您想在 IE 中将 .NET 程序集作为 ActiveX 组件运行吗?老实说,我以前没有这样做过。我认为您需要Regasm.exe 工具来将.NET 程序集注册为可从COM 调用?这就是你生成所有 COM 注册表内容的方式吗?不太清楚。
  • 老经典:COM => .NET.NET => COM。仅供参考。还有one more classic on threading
  • 最终目标是能够通过浏览器访问客户端计算机上的文件系统。我将 ActiveX 范围缩小为实现该功能的一种简单(tm)方法。该项目是用 c# 编写的,所以这就是我用来创建类库的内容。为了回答您的其他问题,我通过在ActiveXExample.dll 上运行加热并将fragment 输出复制到Product.wxs 来生成COM 注册表内容。这可能是一个经典的 XY 问题,欢迎提出建议。
  • ActiveX 在 IE11 中已经相当老旧并且被严重禁用,不确定这对您来说是一个长期的好选择吗?文件访问涉及什么?检索文件以上传到某处或只是查看?也许您可以为您的问题添加更多细节?有些 .NET 程序集公开了标记为可安全编写脚本的 COM 接口。 Here someone has marked FileSystemObject safe for scripting。我敢说危险接近。不确定它是否有效。不确定是否有人应该尝试一下:-)。虚拟的?它可以完全毁掉电脑。本地 Intranet 区域?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多