Installation 安装不带SelfReg的Capicom:Wix自定义操作未找到(错误2721)

Installation 安装不带SelfReg的Capicom:Wix自定义操作未找到(错误2721),installation,wix,windows-installer,custom-action,Installation,Wix,Windows Installer,Custom Action,在成功地遵循中的建议之后,我为另一个自定义操作添加了两行额外的代码。这一个用于调用capicom副本上的regsvr32,我试图将其放入用户的系统文件夹中。然而,我看到了错误2721,这似乎是一个自定义操作未找到的错误。有什么建议吗?我试图通过调用regsvr,而不是在安装过程中添加注册表项来保持与我的安装程序以前的迭代的一致性,这可能是一个好主意耸耸肩: <Directory Id="SystemFolder" Name="Sys"> ... <component .

在成功地遵循中的建议之后,我为另一个自定义操作添加了两行额外的代码。这一个用于调用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时,微软说要安装它就要这么做。四处搜索发现很多人说这是一种愚蠢的方法……但这也是微软提供的机制。我将听取关于更好方法的建议。我认为如果我的应用程序卸载时,CAPICOM被忽略了,这是一个大问题,考虑到它是一个标准的Windows组件。
编辑:嗯。显然,在dll上运行selfreg的一件事就是创建一个随机种子添加到注册表中。我不确定它使用什么机制来生成这个种子,但我怀疑仅仅自己生成一个种子会被认为是低级趣味,特别是如果我给所有用户相同的种子。不确定。。。。显然,如果我跳过这个Capicom,它是自己完成的,所以我很好。

嗯,你真的想自己安装Windows系统文件吗?这在很多层面上都是不允许的。此外,regsvr32.exe是SelfReg,众所周知,SelfReg在安装中是邪恶的。实际上,使用Windows安装程序编写注册是远远优于我们的


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

嗯,你真的想自己安装Windows系统文件吗?这在很多层面上都是不允许的。此外,regsvr32.exe是SelfReg,众所周知,SelfReg在安装中是邪恶的。实际上,使用Windows安装程序编写注册是远远优于我们的


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

您可以在文件上使用heat来创建输出WXS文件,当执行msi时,该文件将在注册表中放置capicom.dll信息,而不使用regsvr32

大概是这样的:

heat file [Path\Capicom.dll] -template:product -out capicom.wxs
然后将capicom.wxs添加到安装程序中,在该文件中创建一个ComponentGroup元素,该元素包含以下组件元素:


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

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

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

... [其他组件或组件组参考]

您可以在文件上使用heat来创建输出WXS文件,当执行msi时,该文件将在注册表中放置capicom.dll信息,而不使用regsvr32

大概是这样的:

heat file [Path\Capicom.dll] -template:product -out capicom.wxs
然后将capicom.wxs添加到安装程序中,在该文件中创建一个ComponentGroup元素,该元素包含以下组件元素:


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

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

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

... [其他组件或组件组参考]
正确的方法:

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

  • 运行Adam Tengen的程序

请注意,自本帖发布之日起,热量(和牛脂,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>

...
正确的方法:

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

  • 运行Adam Tengen的程序

请注意,自本帖发布之日起,热量(和牛脂,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>

...

Ach,我觉得自己很傻。我不记得我最初从msi中提取capicom的动机,但你是对的,这是个坏主意。我应该为它执行MS的msi。尽管如此,我还是很好奇到底出了什么问题。这很公平。我将按照MS的capicom redist中的安装说明进行操作:要将capicom从capicom.CAB中提取“capicom.DLL”安装到system32目录,然后执行“regsvr32.exe capicom.DLL”HehAch,我觉得很傻。我不记得我最初从msi中提取capicom的动机,但你是对的,这是个坏主意。我应该为它执行MS的msi。尽管如此,我还是很好奇到底出了什么问题。这很公平。我将按照MS的capicom redist中的安装说明进行操作:要将capicom从capicom.CAB中提取“capicom.DLL”安装到system32目录,然后执行“regsvr32.exe capicom.DLL”HehGood idea,但它不会工作。文件按预期显示,但未正确注册。我试着在安装后手动运行regsvr32,它成功了。好主意,但不起作用。文件按预期显示,但未正确注册。我在安装后尝试手动运行regsvr32,它成功了。你在库上有没有tyr Heat?Heat+Capicom=Fail:(你在库上有没有tyr Heat?Heat+Capicom=Fail:(是的,我知道我可以改为设置selfregcost。是的,我知道我可以改为设置selfregcost。