首页 > 解决方案 > Visual Studio 安装项目 (vdproj) - STDOLE,如何正确注册 COM DLL?

问题描述

我正在使用 Visual Studio 2015 安装项目。

我在设置中有一个 COM DLL,它引用了 STDOLE(系统类型库,{00020430-0000-0000-C000-000000000046},据我了解,不能注册,因为它是受保护的文件/注册)。如果您尝试注册它,您会在安装 MSI 时遇到错误(警告)。

然而,vdproj 扩展将此 DLL 的注册添加到“TypeLib”MSI 表中。似乎它并不总是这样做,但在某些情况下我无法推断。我没有选择排除该 tlb,它以某种方式不断重新出现(可能来自依赖项?)

  1. 为什么 vdproj 会尝试注册不应注册的 DLL?
  2. 如何避免这种情况?我尝试使用脚本添加生成的 MSI 的手动后期编辑以删除该 tlb,并且有效;然而,这似乎是解决问题的一种完全邪恶的方法。

对于这个特定项目,我坚持使用 Visual Studio 安装程序,无法切换到更合理和透明的替代方案(例如 WiX)。非常感谢任何帮助或建议!

标签: visual-studio-2015windows-installervdproj

解决方案


VB6 运行时:注册表项:Typelib\{000204EF-0000-0000-C000-000000000046}Visual Basic 6 RuntimeWiX 中的一个已知问题,即heat.exe提取 COM 数据错误地为每个 ActiveX 或 COM 组件带来此注册表项。请注意,这不是 WiX 的错,而是 VB6 的一般问题。因此,您在 Visual Studio 安装程序项目中也看到了问题。

来自 WiX 帮助手册(用于 heat.exe)(多用途工具,其中之一是 COM 注册提取):“ ...注册在 VB6 中创建的 COM 组件时,它会添加属于 VB6 运行时组件的注册表项. 建议 VB6 组件使用此标志,以避免在卸载时破坏 VB6 运行时。排除以下值:CLSID\{D5DE8D20-5BB8-11D1-A1E3-00A0C90F2731}Typelib\{EA544A21-C82D-11D1-A3E4-00A0C90AEA82}Typelib\{000204EF-0000-0000-C000-000000000046}、引用这两个类型库的任何接口` "

解决方案:现在最困难的部分是,实际的解决方法是什么?坦率地说,我现在没有时间测试,但我想你可以用 Orca 打开最终的 MSI 并删除这些条目——如果它们在那里的话。我想这正是你现在正在做的事情,所以你又回到了原点,但至少对于导致问题的原因有点清楚。I suppose you can try to run the build when the VB6 component is unregistered as opposed to when it is registered?如果在构建时未注册组件,它只会提取密钥,这在某种意义上是有意义的吗?If this is the case, maybe try to self-register your VB6 component prior to the setup build.


RegSpy.exe:您可以使用名为RegSpy(实际上是 RegSpy2)的工具从 COM 文件中提取 COM 注册信息。你可以在“Release”文件夹中找到exe,然后你去:

regspy.exe richtx32.ocx >> richtx32.reg

然后,您可以将 reg 文件导入您的 Visual Studio 安装程序项目。请记住用 MSI 目录属性替换硬编码路径,并删除上面提到的错误 VB6 条目。

VSProj:在 Visual Studio 中,Right click Visual Studio Installer Project=>View=>Registry=>Right Click Top Node=>Import...


推荐阅读