2012-10-25 41 views
1

我有一個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以嘗試獲得不同的結果。沒有區別。

+0

NOTREG表示它沒有正確註冊。使用SysInternals的ProcMon進行診斷,您會看到它在註冊表中搜索guid。 –

+0

感覺它是32位與64位的問題,或者是針對所有人註冊,而不是當前的用戶問題。 –

+0

Raymond Chen的精神力量告訴我[你在64位機器上註冊了32位版本的XYZ.DLL](http://blogs.msdn.com/b/oldnewthing/archive/2011/02/02/10/ 10127054.aspx)。 –

回答

0

那麼,我發現什麼會工作。

IMyClassPtr obj; 
HRESULT hr = obj.CreateInstance(CLSID_MyClass); 

CLSID_MyCLass是生成的MyClass_TLB.cpp文件中的guid常量。對類類型使用它而不是__uuidof(...)使所有內容都能夠正常工作。

+0

我有類似的問題。我想嘗試你的解決方案,但是編譯器找不到CLSID_MyClass。 – vbocan