如何自动注册ATL服务?

时间:2014-05-08 02:22:36

标签: com windows-services wix windows-installer atl

我有一个包含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

非常感谢

1 个答案:

答案 0 :(得分:0)

WiX有一个名为Heat的程序,可用于收集ATL服务器的COM元数据。运行此程序以生成wxs fragement,将COM元素迁移到wxs fragement,然后在干净的快照VM上重建和测试。如果需要,冲洗并重复,因为COM / ATL有时会有点棘手。

Harvest Tool (Heat)