1

在成功遵循这个问题中的建议后,我为另一个自定义操作添加了几行额外的代码。这个是为了在我试图放入用户系统文件夹的 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提供的机制。我会听取建议以寻求更好的方法。考虑到它是标准的 Windows 组件,如果在卸载我的应用程序时留下 Capicom,我认为这没什么大不了的。

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

4

3 回答 3

3

正确的方式:

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

  • 从 Adam Tengen 的帖子中运行程序。

请注意,截至本文发布时,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>
于 2009-01-15T15:25:11.217 回答
1

呃,你真的要自己安装Windows系统文件吗?这在很多层面上都是不允许的。此外,regsvr32.exe 是 SelfReg,而 SelfReg 在安装中是众所周知的。实际使用 Windows Installer 编写注册是有优势的

但是,这里的整个设计非常可疑。

于 2008-11-20T17:52:15.210 回答
0

您可以在文件上使用 heat 来创建一个输出 WXS 文件,当执行 msi 时,它将在不使用 regsvr32 的情况下将 capicom.dll 信息放入注册表

像这样:

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>
于 2008-11-20T18:44:18.973 回答