我以前从未使用过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;
}


谢谢。

编辑-我应该补充一点,因为我没有能力进行远程调试,因此我不能只是使用调试器进入该功能。

最佳答案

0x8876086cD3DERR_INVALIDCALL,因此导致此问题的根本原因可能与Direct3D有关,而不是COM或ATL。要对此进行进一步的故障排除,您需要查看在那里使用的CLSID和IID参数,以查看此代码究竟是什么使COM对象失败。

关于c++ - 实例化COM和ATL类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9875164/

10-11 16:08