C#COM DLL在C ++项目中有REGDB_E_CLASSNOTREG错误

时间:2012-10-25 16:54:26

标签: c++ c#-4.0 com-interop

我有一个C#dll,我已经正确注册了COM Interop,并使COM可见。使用cppbuilder,我导入了类型库,它生成了包装类,我现在正试图用来创建我的C#类的实例。但是,我的C ++代码中出现了REGDB_E_CLASSNOTREG错误。我验证了dll是在注册表中,甚至用regasm重新注册它。没变。我能错过什么?

这是我的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以尝试获得不同的结果。没有差异。

1 个答案:

答案 0 :(得分:0)

好吧,我发现了什么可行。

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

CLSID_MyCLass是生成的MyClass_TLB.cpp文件中的guid常量。对类类型使用它而不是__uuidof(...)可以使一切开始正常工作。