将.dll注册到COM时出错

时间:2014-02-27 14:51:55

标签: wix wix3.5 wix3.6 dllregistration

我有一个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...

2 个答案:

答案 0 :(得分:2)

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

简短的回答是你应该解决热量收获问题。它是64位Dll吗?

答案 1 :(得分:1)

您的COM dll看起来有问题,或者它缺少依赖性,无法通过heat.exe加载。两个可以提供帮助的工具:依赖性walker和regspy:

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

Dependency Walker (来自Steve Miller的免费软件):

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

根据运行这两个工具的结果,您可能需要修复dll中的某些内容,或者仅使用所有依赖项正确执行com数据提取。

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

相关问题