我有一个 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 以尝试获得不同的结果。没有区别。