Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CoCreateInstance未启动或连接到ATL COM服务_C++_Visual Studio 2010_Com_Windows Services_Atl - Fatal编程技术网

C++ CoCreateInstance未启动或连接到ATL COM服务

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,

我有一个ATL COM服务exe(MyService.exe),它编译和运行良好。如果我安装此服务(通过MyService.exe/service),它将成功安装到SCM中。我可以通过SCM启动服务,它在LOCALSYSTEM帐户下运行良好

当我试图创建由服务定义的COM类的实例时,问题就出现了。我的测试线束应用程序(MyServiceTest.exe)调用以下内容:

::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)