我有一个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...
错误1722只是意味着程序意外完成,这意味着它不是路径问题。"正确路径"的想法可能是一个问题,这取决于Dll或regsvr32的版本是64位还是32位。在32位Dll上运行64位regsvr32可能会导致此问题。我也不清楚(在自定义操作的上下文中)Windows会自动知道你想要哪个比特regsvr32以及它在哪里
简单的答案是你应该解决热火队的收获问题。它是64位Dll吗?
看起来你的COM dll有问题,或者它缺乏依赖项,无法通过heat.exe加载。有两个工具可以提供帮助:依赖项walker和regspy:
RegSpy(Phil Wilson等人的免费软件,从Stefan Kruger的http://installsite.org/。工具页面。):
- http://www.installsite.org/files/iswi/RegSpy2.zip
DependencyWalker(Steve Miller的免费软件):
- http://www.dependencywalker.com/
首先尝试RegSpy以确定它是否可以从dll中提取com数据。如果这不起作用,请使用依赖项Walker检查是否存在阻止加载dll的缺少依赖项。这些可能是其他dll,甚至是资源文件,如图像或语言dll,它们只是资源文件(有时带有图像)。
根据运行这两个工具的结果,您可能需要修复dll中的某些内容,或者在所有依赖项都到位的情况下正确执行com数据提取。
请注意,有些COM文件在注册过程中确实做了一些疯狂的事情,比如更改TCP/IP的网络参数或天知道还有什么。罕见,但严重的COM组件设计错误。RegSpy可以揭示这一点,但最常见的情况是,如果你重新打包应用程序。