我的项目使用了几个带有 activex 控件的 dll 文件。
现在我正在制作一个部署项目(Windows 安装程序)。
我需要使用 regsvr32 通过 Windows 安装程序注册 dll。我应该怎么做?我可以检测 regsvr32 是否失败?
我的项目使用了几个带有 activex 控件的 dll 文件。
现在我正在制作一个部署项目(Windows 安装程序)。
我需要使用 regsvr32 通过 Windows 安装程序注册 dll。我应该怎么做?我可以检测 regsvr32 是否失败?
我假设当你说你正在创建一个部署项目时,你是在谈论 Visual Studio 中可用的令人讨厌的工作?
如果是这样,对于每个 DLL,您可以查看它们的属性,并将“Register”属性设置为 COM。
如果您正在使用其他一些部署技术(例如 Wix、InstallShield 等),那么答案会有所不同,但其中大多数都有一个简单的设置来表示“这是一个需要注册的 COM dll”,而不是您必须启动 regsvr32。
至于检测失败——使用内置工具,在正常安装过程中进行COM注册,失败会导致安装回滚——这个不需要自己检查;就像您不必检查文件是否已到达安装位置一样,也不必担心磁盘已满。
在安装过程中注册 COM 接口的最佳方式regsvr32
是不要。(咧嘴笑)
在基于 Windows Installer 的安装期间调用regsvr32
和其他形式的“自我注册”是不好的做法。COM 接口通常在多个产品之间共享。如果包 A 注册了 COM 接口IFoo
,那么包 B(重新)注册了相同的接口,那么如果任何一个包被卸载并取消注册IFoo
,它就会破坏剩余的包。
首选方法是提取 COM 接口信息并将其构建到包中的注册表项中.msi
。MSI 识别匹配的 COM 注册表条目并管理它们的引用计数,而不是复制它们。第 2..N 个条目只是增加了引用计数,每次卸载只是减少它,直到最后一次卸载将引用计数减少到零并且注册表条目实际上被删除。
在 WiX 中,heat工具用于将 COM 接口(以及其他数据)“收集”成包含必要注册表项的 WiX 源片段。Installshield 有一个“COM extract at build”标志,它对 MSI 和 Installscript-MSI 项目做同样的事情。其他 Windows Installer 工具集具有类似的功能。
注意:Windows Installer(MSI) 是底层安装管理 API,它是 Windows 本身的一部分。您需要其他工具来生成.msi
使用此 API 的包。
.msi
Windows Installer XML (WiX) 是一种 XML 架构,用于描述基于 MSI 的安装包,以及用于从该架构中的文档生成实际包的工具。Installshield 是另一个可以生成.msi
包的工具。
这是我用过的两个。还有其他工具,例如 InstallAware 和 Advanced Installer。我无法谈论他们的能力,我自己从未使用过它们。Visual Studio 也有一个插件来生成安装包,但根据我的经验,它很难扩展到工业级产品。
你应该调查一下WiX它是 MS 的一个开源项目,它创建 Windows 安装程序 (.msi) 有一个名为 heat 的工具可以在不同的输入上生成代码,其中一个是 dll 寄存器等。安装程序框架将负责是否发生了正确的注册