我之前从未使用过COM或ATL,但现在我遇到了使用两者的代码。在下面的代码中对CreateInstance的调用返回一个HRESULT,它不被_com_error.ErrorMessage识别,即错误字符串是“未知错误:0x8876086c”。我对实际调用的函数有点困惑,因为IClassFactory接口只声明了一个纯虚函数CreateInstance,_AtlComModule的类型'CAtlComModule'似乎没有CreateInstance成员函数。
STDMETHODIMP CGdtvEngine::CoCreateInstance(const CLSID &clsid, const IID &iid, void **obj)
{
CComPtr <IClassFactory> factory;
HRESULT hr = AtlComModuleGetClassObject(&_AtlComModule, clsid, __uuidof(factory), (void **)&factory);
_com_error err1(hr);
Log(_T("Result of AtlComModuleGetClassObject: %s"), err1.ErrorMessage();
hr = factory->CreateInstance(NULL, iid, obj);
_com_error err2(hr);
Log(_T("Result of factory->CreateInstance: %s"), err2.ErrorMessage() );
return hr;
}
感谢。
编辑 - 我应该补充一下,因为我没有能力进行远程调试,所以我不能只使用调试器进入函数。
答案 0 :(得分:1)
0x8876086c
是D3DERR_INVALIDCALL
因此问题的根本原因可能是与Direct3D有关,而不是COM或ATL。要进一步解决这个问题,您需要查看您在那里使用的CLSID和IID参数,以便查看COM对象在此代码中失败的原因。