将 .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.zipDependency 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中,直接注册会出错