用WIX注册COM EXE

时间:2019-04-01 08:34:07

标签: wix

我用两个新项目创建了一个解决方案:ATLProject1是COM dll,而ATLProject2是COM EXE。在两个项目中,都使用单一方法添加了相同的简单类。

将两者都添加到WIX安装项目中(这是一个已经安装了其他COM dll的现有安装项目。我仅将其用于此测试)。

在product.wxs中添加了以下几行:

        <Component Id="ATLProject1.dll" Guid="{...}">
          <File Id="ATLProject1.dll" Name="ATLProject1.dll" KeyPath="yes" SelfRegCost="0" Source="$(var.TargetDir)\ATLProject1.dll" />
        </Component>
        <Component Id="ATLProject2.exe" Guid="{...}">
          <File Id="ATLProject2.exe" Name="ATLProject2.exe" KeyPath="yes" SelfRegCost="0" Source="$(var.TargetDir)\ATLProject2.exe" />
        </Component>

还有

  <ComponentRef Id="ATLProject1.dll" />
  <ComponentRef Id="ATLProject2.exe" />

文件还包含以下几行:

<EnsureTable Id="PublishComponent"/>
<EnsureTable Id="Condition"/>
<EnsureTable Id="TypeLib"/>
<EnsureTable Id="Class"/>
<EnsureTable Id="Extension"/>

运行安装程序时出现错误:“模块ATLProject2.exe无法注册。HRESULT -2147024769” (找不到指定过程的十六进制0x8007007f)。

如果我从安装程序中删除了ATLProject2,则它成功并且ATLProject1已在注册表中正确注册(这不会生成注册表信息,例如,使用热量就可以了)。

exe组件应该区别对待吗?

我找到了this 10 year old post suggesting heat.exe does not treat COM exe as COM。如果这是问题,不确定是否仍然如此?

2 个答案:

答案 0 :(得分:1)

Windows Installer不建议在安装时使用SelfReg进行注册。相反,强烈建议将注册添加到您的.wxs代码或在构建时捕获注册。

要手动添加注册,请不要使用EnsureTable,而要使用与COM相关的元素(例如ClassProgIdTypeLib)。它可能很乏味,但比在安装过程中尝试自我调节要强大得多。

不幸的是,使用heat.exe(在WiX工具集中提供)在构建过程中捕获注册的替代方法不支持从可执行文件捕获。如果您愿意采用商业解决方案,我们(FireGiant)会开发alternative to heat.exe that can capture executable registration(还有更多)。 advanced harvesting solution has more documentation on the FireGiant site

答案 1 :(得分:0)

RegServer交换机 :COM EXE文件通常通过 /RegServer 开关进行自我注册,如下所示:

MyBinary.exe /RegServer

换句话说,EXE文件不是通过常规的 regsvr32.exe 机制注册的。这是用于注册COM dll和OCX文件的工具,但它不处理EXE文件。还有一个 /UnRegServer 开关可以注销EXE COM文件-对于支持 /RegServer which is not all COM EXE files - it could be missing as a feature < / strong>)。

自注册 :自注册不是注册COM文件的理想选择,这是这种情况的摘要: { {3}} 。在MSI中,它会提取COM注册表数据并填充许多特殊的COM表,以允许COM服务器以支持高级功能(如回滚)的方式进行注册。我也不喜欢COM提取(MSI register dll - Self-Registration considered harmfulrisk of self-repair problems),但在大多数情况下会有所帮助-特别是在存在可能触发注册问题的依赖项时。而且,这是应该在MSI中注册COM文件的方式。这是标准。我应该注意,某些COM设置仍会进入注册表表-因为没有专用的与COM相关的表。

heat.exe :WiX自己的 heat.exe 工具现在可以从dll文件和ocx文件中提取COM数据(32-位)。但这似乎不适用于EXE COM文件-我不确定为什么:

heat.exe file MyCOMDll.dll -out MyCOMDll.wxs

RegSpy2.exe :有一个工具可用于从 DLL OCX两者中提取COM注册信息。 strong>和 EXE 文件。可以从这里下载:more on self-repair problemshttp://www.installsite.org/files/iswi/RegSpy2.zip RegSpy tool 由MSI专家和Here is the main page listing numerous toolsThe Definitive Guide to Windows Installer)的作者 Phil Wilson 编写。

这里是如何从COM可执行文件中提取COM数据(如果没有数据,请先尝试注销该文件,然后运行 regspy.exe ):

RegSpy.exe MyBinary.exe /RegServer >> RegistryOutput.reg

导出的 *.reg file 随后可以转换为WiX元素。这不是一个容易的过程。使用WiX工具 heat.exe 不会填充正确的COM表,而是将所有内容都放在 Registry table 中(尽管可以,但是会禁止MSI验证错误):

heat.exe reg MyCOMRegistryData.reg -out MyWiXFile.wxs -sfrag -suid

曾经有一个名为Tallow的工具,可将reg文件转换为WiX COM注册,但此工具已无处可寻。除了自己编写,下载APress并导入COM数据或提取数据并使用 dark.exe 反编译生成的MSI之外,我不知道有其他方法可以生成它并删除WiX标记。或弄清楚 heat.exe 如何使用COM数据写入其WiX XML输出,并对其进行修改以处理RegSpy.exe的输出。

更新 :链接到石蜡another deployment tool。据说这是“更好的牛脂”。我不确定它在COM提取方面支持什么。我的快速测试似乎表明它根本不支持COM提取,但是支持自动生成WiX标记以及添加和删除文件以进行更新。

自定义操作 :可以通过调用 /RegServer 开关的自定义操作来注册COM EXE。同样,尽管出于上述链接(https://github.com/Wintellect/Paraffin)中列出的所有原因而不建议这样做。


某些链接