托管可执行文件作为服务运行时COM调用不起作用

时间:2010-06-03 12:51:43

标签: com windows-services dcom

我们有一个托管COM服务器的可执行文件,比如x.exe。 COM对象在调用站点上实例化如下:

hRes = CoCreateInstance(CLSID_InterceptX, NULL, CLSCTX_SERVER, 
                IID_IInterceptX, (void**)&pInterceptX);

全部works fine when x runs as an regular application

我们在Windows下有一个封装x.exe so that it runs as a service的工具。在这种情况下,我们永远不会在x.exe中接收COM调用(通过日志记录验证)。这是一个奇怪的部分:从记录调用站点,我可以看出COM对象已经成功实例化,并且对接口函数的调用也不会产生错误(SUCEEDED(hres)为真)。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我猜三件事中有一件(或可能全部)正在发生(按可能性排序):

(1)尚未配置AppID密钥中的LocalService值,而是将其作为常规程序启动。

(2)当“srvany”(或等效)程序执行COM服务器时,它没有通过必要的命令行选项(如“-automation”)来注册服务器对象。但是,大多数框架会自动注册类对象。记录传递给服务器的命令行,看看是否是这种情况。

(3)服务器不调用CoInitializeSecurity(大多数框架没有调用),也没有声明AccessPermissions。请使用dcomcnfg进行检查。但是,这应该使调用失败,而不是启动新服务器。

您没有说服务在哪个帐户下运行;您是否尝试将其作为与交互式用户相同的帐户运行,并允许它与桌面交互(作为调试措施 - 您不应该在生产中执行此操作!)?

答案 1 :(得分:0)

在将VB6 COM服务器应用程序(OPC服务器)作为Windows NT服务运行时,我遇到了完全相同的问题(在原始问题中没有迹象表明COM服务器是否是VB6应用程序,但在我的情况下它是)。 最后,Microsoft article已确认当VB6应用程序作为服务运行时,COM / DCOM将无法工作(无论您是否设法让应用程序首先作为服务运行)。< / p>

以下是文章的引用:

  

Microsoft目前不建议也不支持将Visual Basic应用程序作为Microsoft Windows NT,Windows 2000和Windows XP Services运行,因为在安装和运行Microsoft Windows服务时,应用程序可能会出现不稳定的行为

另一个:

  

在使用Microsoft Visual Basic编写的Microsoft Windows服务中,开发人员可能会遇到使用Microsoft技术(如ODBC,DCOM,OLE自动化和DAO)的困难。出于这个原因,并且出于上述原因,Microsoft建议开发人员避免在用Microsoft Visual Basic编写的Microsoft Windows NT服务中使用这些技术。