1

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

4

1 回答 1

0

好吧,我发现了什么会起作用。

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

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

于 2012-11-09T18:33:41.493 回答