visual-studio-2015 - Visual Studio 安装项目 (vdproj) - STDOLE,如何正确注册 COM DLL?
问题描述
我正在使用 Visual Studio 2015 安装项目。
我在设置中有一个 COM DLL,它引用了 STDOLE(系统类型库,{00020430-0000-0000-C000-000000000046},据我了解,不能注册,因为它是受保护的文件/注册)。如果您尝试注册它,您会在安装 MSI 时遇到错误(警告)。
然而,vdproj 扩展将此 DLL 的注册添加到“TypeLib”MSI 表中。似乎它并不总是这样做,但在某些情况下我无法推断。我没有选择排除该 tlb,它以某种方式不断重新出现(可能来自依赖项?)
- 为什么 vdproj 会尝试注册不应注册的 DLL?
- 如何避免这种情况?我尝试使用脚本添加生成的 MSI 的手动后期编辑以删除该 tlb,并且有效;然而,这似乎是解决问题的一种完全邪恶的方法。
对于这个特定项目,我坚持使用 Visual Studio 安装程序,无法切换到更合理和透明的替代方案(例如 WiX)。非常感谢任何帮助或建议!
解决方案
VB6 运行时:注册表项:Typelib\{000204EF-0000-0000-C000-000000000046}
是Visual Basic 6 Runtime
WiX 中的一个已知问题,即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...
推荐阅读
- scala - 为什么我在 Spark 中使用 combineByKey 的字数是值总和的两倍?
- javascript - DataTable 列过滤不提取值
- windows - 如何在启动时停止出现命令提示符?
- jbase - 在jbase中找到死代码的好方法是什么?
- python - 如何在 python 中替换 dict 中的字符
- java - 无法解析 commons-collections:commons-collections:2.1
- https - create-react-app:如何使用 https 但带有签名证书?
- visual-studio-code - VSCode 中用于 IntelliSense 信息的提供程序是什么?
- android - 显示一个菜单元素并隐藏另一个
- amazon-web-services - AWS API Gateway Websocket 路由缺少 Cognito 信息