C++ CoCreateInstance未启动或连接到ATL COM服务
我有一个ATL COM服务exe(MyService.exe),它编译和运行良好。如果我安装此服务(通过MyService.exe/service),它将成功安装到SCM中。我可以通过SCM启动服务,它在LOCALSYSTEM帐户下运行良好 当我试图创建由服务定义的COM类的实例时,问题就出现了。我的测试线束应用程序(MyServiceTest.exe)调用以下内容:C++ CoCreateInstance未启动或连接到ATL COM服务,c++,visual-studio-2010,com,windows-services,atl,C++,Visual Studio 2010,Com,Windows Services,Atl,我有一个ATL COM服务exe(MyService.exe),它编译和运行良好。如果我安装此服务(通过MyService.exe/service),它将成功安装到SCM中。我可以通过SCM启动服务,它在LOCALSYSTEM帐户下运行良好 当我试图创建由服务定义的COM类的实例时,问题就出现了。我的测试线束应用程序(MyServiceTest.exe)调用以下内容: ::CoInitialize(NULL); ::CoInitializeSecurity(NULL,
::CoInitialize(NULL);
::CoInitializeSecurity(NULL,
NULL,
NULL,
NULL,
RPC_C_AUTHN_LEVEL_PKT,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
EOAC_NONE,
NULL);
ATL::CComPtr<IMyServiceInterface> pInterface;
HRESULT hr = CoCreateInstance(CLSID_MyServiceInterface, NULL, CLSCTX_LOCAL_SERVER, IID_IMyServiceInterface, reinterpret_cast<void**>(&pInterface));
我做错了什么
p.S.MyService.exe在启动后不应退出,因为它在Run()函数中包含一个WaitForSingleObject(),该函数正在等待外部信号(该信号也在OnStop()中设置,以便SCM可以停止服务)。这就是为什么MyService.exe在MyService.exe完成后仍然存在。这是期望的行为(对于服务而言,这是它应该运行的状态)。如果您已经介绍了这一点,请原谅: 运行DCOMCNFG.EXE 深入查看组件服务\Computers\My Computer\DCOM配置 找到您的组件,右键单击并激活“属性”
在“标识”选项卡中,确保COM组件被配置为在服务运行时所使用的相同标识下运行。事实证明,罪魁祸首是服务的注册方式。为了让类将其控制应用程序作为服务启动,控制应用程序需要将条目添加到注册表中,以便将其识别为本地服务器,即: (MyService.rgs) 其AppID在MyService.rgs中指定 这将导致注册表中出现以下布局:
HKCR
AppID
{6E5B1E7E-3340-4553-A356-76F1C3543452} (Contains LocalService, ServiceParameters REG_SZ's)
MyService.EXE (Contains AppID REG_SZ)
CLSID
{MyServiceInterface GUID} (Contains MyService.EXE AppID)
相关链接:感谢您对DCOMCNFG的介绍。这是我第一次真正进入COM,所以我没有意识到这一点。组件在标识下设置为“启动用户”。我假设我想将其设置为“系统帐户”,但这是灰色的(这似乎是错误的)。在“常规”选项卡下,应用程序类型列为本地服务器。我想这应该是本地服务?
HKCR
{
NoRemove AppID
{
ForceRemove {6E5B1E7E-3340-4553-A356-76F1C3543452} = s 'MyService'
{
val LocalService = s 'MyService'
val ServiceParameters = s '-Service'
}
'MyService.EXE'
{
val AppID = s {6E5B1E7E-3340-4553-A356-76F1C3543452}
}
}
}
HKCR
AppID
{6E5B1E7E-3340-4553-A356-76F1C3543452} (Contains LocalService, ServiceParameters REG_SZ's)
MyService.EXE (Contains AppID REG_SZ)
CLSID
{MyServiceInterface GUID} (Contains MyService.EXE AppID)