【发布时间】: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