我有一个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以尝试获得不同的结果。没有差异。
答案 0 :(得分:0)
好吧,我发现了什么可行。
IMyClassPtr obj;
HRESULT hr = obj.CreateInstance(CLSID_MyClass);
CLSID_MyCLass是生成的MyClass_TLB.cpp文件中的guid常量。对类类型使用它而不是__uuidof(...)可以使一切开始正常工作。