Инициирование типа COM и ATL - PullRequest
0 голосов
/ 26 марта 2012

Я никогда раньше не использовал ни 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;
}

Спасибо.

РЕДАКТИРОВАТЬ - я должен добавить, так как у меня нет возможности удаленной отладки, я не могу просто войти в функцию с помощью отладчика.

1 Ответ

1 голос
/ 26 марта 2012

0x8876086c равно D3DERR_INVALIDCALL, поэтому основной причиной проблемы может быть что-то, связанное с Direct3D, а не COM или ATL. Чтобы устранить эту проблему далее, вам нужно взглянуть на аргументы CLSID и IID, которые вы там используете, чтобы увидеть, что именно COM-объект терпит неудачу с этим кодом.

...