【问题标题】:trouble with CoCreateInstance methodCoCreateInstance 方法的问题
【发布时间】:2018-04-12 10:47:21
【问题描述】:

我想测试COM Service(EXE),但我无法从CoCreateInstance 检索正确的HRESULT

我的 COM 示例是 'ATLCOMService' Microsoft 示例。如何解决?

而客户端代码是:

    void main()
    {
        HRESULT         hr;
        ISimpleObject *IFirstATL = NULL;

        hr = CoInitialize(0);
        if (SUCCEEDED(hr))
        {
            hr = CoCreateInstance(CLSID_SimpleObject, NULL,
                CLSCTX_LOCAL_SERVER,
                LIBID_ATLCOMServiceLib, (void**)&IFirstATL);
            //hr is: E_NOINTERFACE No such interface supported.

            hr = CoCreateInstance(CLSID_SimpleObject, NULL,
                CLSCTX_INPROC_SERVER,
                LIBID_ATLCOMServiceLib, (void**)&IFirstATL);
            //hr is: REGDB_E_CLASSNOTREG Class not registered

            if (SUCCEEDED(hr))
            {
                BSTR str;
                IFirstATL->HelloWorld(&str);
                cout << str << endl;

                IFirstATL->Release();
            }
            else
            {
                cout << "CoCreateInstance Failed." << endl;
            }
        }
        CoUninitialize();
    }

头文件中的ID是:

    #ifndef CLSID_DEFINED
    #define CLSID_DEFINED
    typedef IID CLSID;
    #endif // CLSID_DEFINED

    #define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \
            const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}

    #endif !_MIDL_USE_GUIDDEF_

    MIDL_DEFINE_GUID(IID, 
    IID_ISimpleObject,0x1B877090,0x76CD,0x4EDE,0x81,0x15,0xEC,
    0x4C,0xCD,0x96,0x76,0xF3);


    MIDL_DEFINE_GUID(IID, LIBID_ATLCOMServiceLib,0xCC2CA6F0,0x2220,0x4D77,0xBA,
    0x46,0x4B,0xCB,0x62,0x15,0x6A,0x28);


    MIDL_DEFINE_GUID(IID, DIID__ISimpleObjectEvents,0x7DACF5E9,0x2885,0x4E4E,
    0x83,0xDD,0xCA,0x6C,0xC3,0xA8,0x8B,0x6D);


    MIDL_DEFINE_GUID(CLSID, 
    CLSID_SimpleObject,0x388F1C82,0xED00,0x4966,0x95,0x90,
    0x02,0xF6,0xB9,0xCC,0xA4,0x1B);

    #undef MIDL_DEFINE_GUID

    #ifdef __cplusplus
    }
    #endif

并在下面看到注册表实例和服务状态:

注册表 - CLSID:

注册表 - typeid :

和 服务状态:

【问题讨论】:

  • 你有什么问题?
  • 我不知道为什么 CoCreateInstance 返回这些结果?以及如何解决这个问题?
  • 返回什么结果?
  • 对于进程外服务器(不要这样做),您必须始终注册代理和存根,以便可以跨进程屏障编组接口。如果不是,则 E_NOINTERFACE 是 COM 找不到编组方法时的结果。 ATL 项目模板自动生成 PS 项目,确保所有项目都正确构建并正确注册。从 SysInternals 的 ProcMon 获取更多诊断信息,您将看到客户端正在搜索 Interface 注册表项。 “不要这样做”当然是最好的建议,进程外是脆弱的并且难以排除故障。
  • @DavidHeffernan 我在代码中注释了 CoCreateInstance 的返回值,请看。

标签: c++ winapi com windows-services atl


【解决方案1】:
       hr = CoCreateInstance(CLSID_SimpleObject, 
            NULL,
            CLSCTX_LOCAL_SERVER,
            LIBID_ATLCOMServiceLib, // <<--- IID_ISimpleObject here?
            (void**)&IFirstATL);
        //hr is: E_NOINTERFACE No such interface supported.

请注意,第四个参数应该是您请求的接口的IID,大概是IID_ISimpleObject。 API 返回的错误代码建议您检查您请求的接口是否正确:E_NOINTERFACE(或者如果正确,则可能是服务器错误地没有实现它,或者是编组问题)。

【讨论】:

    猜你喜欢
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    相关资源
    最近更新 更多