我有一個C#的DLL,我正確地註冊了COM Interop,並使COM可見。使用cppbuilder,我導入了生成封裝類的類型庫,現在我試圖用它來創建我的C#類的一個實例。但是,我在C++代碼中遇到了REGDB_E_CLASSNOTREG錯誤。我驗證了這個DLL在註冊表中,甚至用regasm重新註冊。不用找了。我可能會錯過什麼?C#COM dll在C++項目中有REGDB_E_CLASSNOTREG錯誤
這裏是我的C++代碼:
_MyClassPtr obj;
HRESULT hr = obj.CreateInstance(__uuidof(MyClass));
//now hr equals REGDB_E_CLASSNOTREG
我也試過這樣:
IMyClass* obj;
HRESULT hr = CoCreateInstance(__uuidof(MyClass), NULL, CLSCTX_INPROC_SERVER, __uuidof(IMyClass), (void**) &obj);
//same result, hr equals REGDB_E_CLASSNOTREG
我有在C#應用程序一個額外的依賴。我註冊它的COM以及沒有區別,但沒有將它的類型庫導入到C++項目中。
更新:根據下面的評論,我發現的CreateInstance是查找在註冊表中的以下地方的GUID類:
HKCU\Software\Classes\Wow6432Node\CLSID\{guid}
HKCR\Wow6432Node\CLSID\{guid}
HKCU\Software\Classes\CLSID\{guid}
HKCR\CLSID\{guid}
但是,要通過註冊表,在任何的唯一入口與我的程序集相關的CLSID節點是程序集本身的guid,當然,這與該類的guid或接口不同。
我已經在x86和x64模式下手動運行regasm以嘗試獲得不同的結果。沒有區別。
NOTREG表示它沒有正確註冊。使用SysInternals的ProcMon進行診斷,您會看到它在註冊表中搜索guid。 –
感覺它是32位與64位的問題,或者是針對所有人註冊,而不是當前的用戶問題。 –
Raymond Chen的精神力量告訴我[你在64位機器上註冊了32位版本的XYZ.DLL](http://blogs.msdn.com/b/oldnewthing/archive/2011/02/02/10/ 10127054.aspx)。 –