2015-05-05 66 views
0

我有一個ATL DLL,我試圖從ATL EXE消耗。當我嘗試在DLL中創建對象的實例時,它會失敗,並顯示錯誤REGDB_E_CLASSNOTREG。我檢查了註冊表,我可以看到對象已註冊,既有ProgID也有CLSID。確認註冊COM對象CoCreateInstance返回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

好吧,我覺得真的有種傻了。問題在於CComPtr試圖在我正在CoCreating的對象上調用QueryInterface。我正在使用的界面沒有被我創建的類實現。看來會有比REGDB_E_CLASSNOTREG更好的錯誤。像E_NOINTERFACE這樣的東西將是一個更好的返回碼恕我直言。

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