简短的总结答案
您需要停止使用批处理文件和自定义操作进行 COM 注册(不可靠),而是使用 heat.exe 工具提取 COM 注册信息从 WiX 工具包在编译时将 COM 注册添加到您的 MSI 数据库。
64 位二进制文件有一些复杂性,请参阅下面的详细信息。幸运的是,根据上面显示的安装目录,您似乎正在处理一个 32 位组件。
在这种特殊情况下,当所有依赖项都“在”时,它有助于在部署后在 COM 文件上运行 heat.exe place”以便正确加载 COM 文件。这些答案中有很多“调试通信” - 我会将其保留在将来,但首先尝试这个简单的解决方案。也许可以尝试下面描述的新的依赖工具“Dependency.exe”。
长而详细的答案
在我尝试回答这个问题之前(这似乎围绕缺少依赖项或批处理文件中发生了一些奇怪的事情),我想为您澄清一些有关 COM 最佳实践的事情
自我注册被认为是有害的
自我注册不应用于注册 COM 文件。以下描述了为什么会出现这种情况:[MSI 注册 dll - 自我注册被认为有害](https://stackoverflow.com/questions/2736641/com-registration-where-did-the-idea-of-no -自我注册-来自/2737548#2737548)。不过,有个好消息,一旦正确设置,通过内置 MSI 机制按预期执行操作将变得更容易、更可靠。
COM 注册信息而不是使用自定义操作或 SelfReg 表应该在编译时从 COM 文件中提取 - 换句话说,当您从 WiX 源文件编译 MSI 文件时。提取的注册表数据应用于填充 MSI 数据表系列,这些数据表旨在分别在安装和卸载过程中可靠地注册和取消注册 COM 文件。
WiX:“heat.exe”命令行工具
无需了解此过程的复杂细节 - 您只需知道使用什么工具即可。 WiX 为此提供了“heat.exe”工具。它本质上是一个“收集器”工具,能够生成用于多种目的的有效 WiX XML 源文件 - 其中之一是 COM 提取。它还支持一般的遍历目录 - 生成 WiX 源文件,可以安装遍历过程中遇到的文件。一旦您知道如何使用它,它本质上是制作 MSI 包的一种非常快速的方法。
Dependency Walker
因此我们确定您应该花时间学习如何使用 heat.exe 生成正确注册 COM 文件所需的 WiX 源。但是,还有一个问题:缺少依赖项。
为了让 COM 文件能够自行注册,或者让您能够使用 heat.exe 成功提取 COM 注册表数据 - COM文件必须能够正确加载。为此,所有 dll 依赖项必须在相关系统上的可访问位置可用。
获取 Dependency Walker 的副本,并使用它扫描您的 COM 文件以查找它所依赖的文件。以下是由于找不到 MMUtilities.dll 而无法加载的 COM 文件的示例:
[Dependency Walker 输出的图像显示缺少依赖项]
您很可能会发现类似的错误当它从您的安装程序的安装位置运行时,与您的 dll(或任何文件类型,例如 OCX)一起使用。 regsvr32.exe 找不到所需的依赖文件,注册过程失败。
有一些报告缺失的依赖项并不重要 - 我猜这与年龄有关Dependency Walker 工具的版本 - 据我所知,它最近还没有更新。查找您认为是您自己的依赖文件或核心系统文件的文件,而不是您从未听说过的非常长的 dll 名称文件。请记住,某些 dll 具有加载所需的依赖语言 dll。例如,MMUtilities.dll 需要 MmUtilitiesEnglish.dll 或同一文件夹中存在的其他语言 dll 才能正确加载。
上述文件的一些示例误报依赖项:API-MS -WIN-CORE-RTLSUPPORT-L1-1-0.DLL,API-MS-WIN-CORE-PROCESSTHREADS-L1-1-0.DLL, API-MS-WIN-CORE-REGISTRY-L1-1-0.DLL等...有很多。我相信,但我不确定,这些误报的根本原因集中在安装到
的并行组件的问题上以上是如何使用 Wix MSI 安装程序将 CPP DLL 正确注册到 COM 中?的详细内容。更多信息请关注PHP中文网其他相关文章!