将 .dll 注册到 COM 时出错

Posted

技术标签:

【中文标题】将 .dll 注册到 COM 时出错【英文标题】:Error while registering .dll to COM 【发布时间】:2014-02-27 14:51:55 【问题描述】:

我有一个 COM 库,我想在安装 Wix 期间在 COM 中注册。

起初,我尝试使用heat 命令收集信息,但从那个.dll 中没有收集到任何信息。然后我认为我的库是错误的,并尝试使用regsvr32 命令手动安装它,如下所示:

regsvr32.exe /s "RouteToMyLibrary/MyLibrary.dll"

它确实安装正确...

然后我决定使用CustomAction 来安装 .dll,而不是收获,因为它看起来对我来说是一种解决方案。

于是我写了以下CustomAction

 <CustomAction Id="RegisterCOMLibrary" 
               Directory"DirIdOfWhereMyComLibraryIsLocated"
               ExeCommand='regsvr32.exe /s "[DirIdOfWhereMyComLibraryIsLocated]MyLibrary.dll"'></CustomAction>

<InstallExecuteSequence>
    <Custom Action="RegisterCOMLibrary" After="InstallFinalize">NOT Installed</Custom>
</InstallExecuteSequence>

但是,当我运行我的安装程序时,它启动 1722 错误。

我运行安装程序,写一个log.txt,如下所示:

msiexec /i MyInstaller.msi /l*v log.txt

我可以看到 1722 错误。 备注:

目录路径指向正确的位置 如果我从日志中提取 regsvr32 命令并尝试执行它,它会注册 COM 库。

知道我做错了什么以及为什么我不能使用 Wix 的这个自动 CustomAction 注册我的 .dll 吗?

注意:当我执行heat file mylibrary.dll -out mylibrary.wxs 时,它会说:

Could not harvest data from a file that was expected to be a SelfReg DLL...

【问题讨论】:

【参考方案1】:

错误 1722 只是意味着程序意外完成,暗示它不是路径问题。 “正确路径”的想法可能是一个问题,具体取决于 Dll 或 regsvr32 的版本是 64 位还是 32 位。在 32 位 Dll 上运行 64 位 regsvr32 可能会导致该问题。对我来说,(在自定义操作的上下文中)Windows 会自动知道您想要哪个位 regsvr32 以及它在哪里,这对我来说也不是很明显。

简短的回答是您应该解决热量收集问题。它是一个 64 位的 Dll 吗?

【讨论】:

Phil,我还没有在 64 位上尝试过你的 RegSpy 工具。它仍然有效吗?这是我发现的唯一能够正确从 EXE 文件中提取 COM 的工具。 我不知道它是否仍然有效,抱歉。 installsite.org 上有一个更新版本,可能仍在维护中。【参考方案2】:

您的 COM dll 似乎有问题,或者它缺少阻止它通过 heat.exe 加载的依赖项。两个可以提供帮助的工具:dependency walker 和 regspy:

RegSpy(Phil Wilson 和其他人的免费软件,从 Stefan Kruger 的http://installsite.org/ 下载。tools page。):

http://www.installsite.org/files/iswi/RegSpy2.zip

Dependency Walker(Steve Miller 提供的免费软件):

http://www.dependencywalker.com/

首先尝试 RegSpy 以确定它是否可以从 dll 中提取 com 数据。如果这不起作用,请使用 Dependency Walker 检查是否缺少阻止 dll 加载的依赖项。这些可能是其他 dll 甚至是资源文件,例如图像或语言 dll,它们只是资源(有时还带有图像)。

根据运行这两个工具的结果,您可能需要修复 dll 中的某些内容,或者只需在所有依赖项都到位的情况下正确执行 com 数据提取。

请注意,某些 COM 文件在注册过程中确实会疯狂做一些事情 - 例如更改 TCP/IP 的网络参数或天知道还有什么。很少见,但是 COM 组件的严重设计错误。 RegSpy 可以揭示这一点,但最常见的情况是重新打包应用程序。

【讨论】:

以上是关于将 .dll 注册到 COM 时出错的主要内容,如果未能解决你的问题,请参考以下文章

如何单独注册一个32位的autoitx3.dll在64位的xp中,直接注册会出错

如何在vb6中注册一个不能用作com互操作的.net DLL?

可以将免注册 COM 应用于 DLL 吗?

需要在注册表中找到已注册 com dll 的 clsid

Setup Factory打包时注册com dll

招商银行支付dll在64位windows系统下的注册使用问题