成功遵循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自己做,所以我很好。答案 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 "[SystemFolder]Capicom.dll"" 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>