2015-05-05 2 views
0

У меня есть DLL ATL, которую я пытаюсь использовать из ATL Exe. Когда я пытаюсь создать экземпляр объекта в DLL, он терпит неудачу с ошибкой REGDB_E_CLASSNOTREG. Я проверил реестр, и я вижу, что объект зарегистрирован, как ProgID, так и CLSID.Подтвержденный зарегистрированный COM-объект CoCreateInstance return REGDB_E_CLASSNOTREG

CComPtr<IMyInterface> ptrMyInterface; 
ptrMyInterface.CoCreateInstance(L"ProgID", nullptr, CLSCTX_ALL); // Fails 

CLSID myClsid; 
CLSIDFromString(L"{MyCLSID}"), &myClsid); // Correctly looks up the CLSID 
ptrMyInterface.CoCreateInstance(myClsid, nullptr, CLSCTX_ALL); // Also fails 

Любые предложения

+2

Используйте монитор процессов SysInternals, чтобы посмотреть, как ваша программа ищет ключи реестра. –

ответ

0

Ok, я чувствую себя очень глупо. Проблема заключалась в том, что CComPtr пытался вызвать QueryInterface на объект, который я был CoCreating. Интерфейс, который я использовал, не был реализован классом, который я создавал. Похоже, что была бы лучшая ошибка, чем REGDB_E_CLASSNOTREG. Что-то вроде E_NOINTERFACE было бы лучшим кодом возврата IMHO.

CComPtr<IMyCorrectInterface> ptrMyInterface; 
ptrMyInterface.CoCreateInstance(L"ProgID", nullptr, CLSCTX_ALL); // WORKS!!!