在没有SelfReg的情况下安装Capicom:找不到Wix自定义操作(Err 2721)

时间:2008-11-20 17:11:04

标签: installer wix windows-installer custom-action

成功遵循this question中的建议后,我为另一个自定义操作添加了几行代码。这个是打算在我试图放在用户的系统文件夹中的capicom副本上调用regsvr32。但是,我从我看到的错误2721,这似乎是一个自定义操作未找到错误。有什么建议?我试图通过调用regsvr来保持与安装程序的先前迭代的一致性,而不是仅仅在安装期间添加注册表项,这可能是一个好主意。 :::耸肩:::

<Directory Id="SystemFolder" Name="Sys">
  ...
  <component ...>
     ...
    <File Id="CapiCom.Dll" LongName="CapiCom.Dll" Name="CAPICOM.DLL" Source=... />
  </component>
</directory>
...
<CustomAction Id="REGCAPICOM" ExeCommand='regsvr32.exe "[SystemFolder]capicom.dll"' Return = "ignore" Execute="deferred" />
...
<InstallExecuteSequence>
  ...
  <Custom Action="REGCAPICOM" After="InstallFiles" />
</InstallExecuteSequence>

编辑:是的,使用regsvr32作为安装程序很难看。但是当我下载Capicom SDK时,MS就是为了安装它而做的。搜索周围发现许多人说这是一种愚蠢的方式......但它也是MS提供的机制。我会听取更好方法的建议。如果Capicom在卸载我的应用程序时被遗忘,我认为这不是什么大问题,因为它是一个标准的Windows组件。

编辑:嗯。显然,在dll上运行selfreg的一件事就是创建一个随机种子来添加到注册表中。不知道它用什么机制来生成这个种子,但我怀疑它本身就会被认为只是自己生成一个,特别是如果我给所有用户提供相同的种子。不确定....显然如果我跳过这个Capicom自己做,所以我很好。

3 个答案:

答案 0 :(得分:3)

正确的方式:

  • c:\ Program Files \ Microsoft Visual Studio .NET 2003 \ Common7 \ Tools \ Deployment \ regcap.exe“/ O capicom.reg capicom.dll

  • 从Adam Tengen的post here运行程序。

请注意,Heat(和Tallow,IIRC)在发布时不会在Capicom上正常工作。

错误的方式:

<CustomAction Id="RegisterCapicom" Directory="SystemFolder" ExeCommand="regsvr32.exe /s &quot;[SystemFolder]Capicom.dll&quot;" Return="check" Execute="deferred" />
...
<InstallExecuteSequence>
  <Custom Action="RegisterCapicom" After="InstallFiles" />
</InstallExecuteSequence>

答案 1 :(得分:1)

呃,你真的想自己安装一个Windows系统文件吗?在许多层面上都不允许这样做。另外,regsvr32.exe是SelfReg,众所周知SelfReg在安装中是邪恶的。实际上使用Windows Installer编写注册远远超过

然而,这里的整个设计非常可疑。

答案 2 :(得分:0)

你可以在File上使用heat来创建一个输出WXS文件,当msi被执行时,它将把capicom.dll信息放在注册表中而不使用regsvr32

像这样:

heat file [Path\Capicom.dll] -template:product -out capicom.wxs

然后将capicom.wxs添加到安装程序中,在该文件中创建一个ComponentGroup元素,其中包含Component(s)元素:

<ComponentGroup Id="capicom">
  <ComponentRef Id="capicom.dll"/>
</ComponentGroup>

在主WXS文件中添加将链接capicom组件的Fragment元素

  

最后一步是将ComponentGroupRef添加到它所属的功能中:

<Feature Id="PRODUCTFEATURE">
  <ComponentGroupRef Id="capicom" />
  ... [Other components or ComponentGroups references]
</Feature>