我有一个包含ATL服务的项目。目前,我们的安装程序使用以下命令注册服务,并使用自定义操作运行已安装的服务可执行文件:
MyService.exe /server
并使用命令
取消注册MyService.exe /unregservice
这在某些情况下引起了令人头疼的问题,即命令失败并且安装陷入无法完成或完全回滚的状态,导致应用程序无法使用。
我们希望使用ServiceInstall标记替换这些自定义操作,以完全在MSI文件中进行注册,但我们无法使其工作。我们的初始代码如下所示:
<Component Id="c.MyService.exe" Guid="{PUT-GUID-HERE}">
<File Id="f.MyService.exe" Name="MyService.exe" KeyPath="yes"
DiskId="1" Source="$(var.MyService.TargetPath)" Vital="yes" />
<ServiceInstall Id="svci.MyService" Name="MyService" Type="ownProcess"
Start="demand" ErrorControl="normal" DisplayName="MyService"
Description="My Service" Account="LocalSystem" Interactive="no"
Vital="yes">
<ServiceDependency Id="RPCSS"/>
</ServiceInstall>
<ServiceControl Id="svcc.MyService" Stop="both" Remove="uninstall"
Name="MyService" Wait="yes" />
</Component>
安装将完成,但运行该程序失败并显示以下消息:
Retrieving the COM class factory for component with CLSID {...} failed due to the following error: 80040152 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
通过谷歌发现的一个建议是在Component标签内添加AppId标签,如下所示:
<Component ... />
...
<AppId Id="$(var.MyServiceGUID)" LocalService="MyService" Description="MyService" />
...
</Component>
然而这没有任何效果。
如何在MSI中复制ATL的自我注册?
作为参考,我相信我遇到的问题与这篇古老而未答复的帖子相同:http://social.msdn.microsoft.com/Forums/vstudio/en-US/eb33cf47-628a-4fbf-a740-f81afe2f2b43/atl-service-install-and-registration-issue-com-server-vs-windows-service?forum=vcgeneral
非常感谢
答案 0 :(得分:0)
WiX有一个名为Heat的程序,可用于收集ATL服务器的COM元数据。运行此程序以生成wxs fragement,将COM元素迁移到wxs fragement,然后在干净的快照VM上重建和测试。如果需要,冲洗并重复,因为COM / ATL有时会有点棘手。