【问题标题】:C# COM dll has REGDB_E_CLASSNOTREG error in C++ projectC# COM dll 在 C++ 项目中有 REGDB_E_CLASSNOTREG 错误
【发布时间】:2012-10-15 22:13:17
【问题描述】:

我有一个 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++项目。

更新:根据下面的 cmets,我发现 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 以尝试获得不同的结果。没有区别。

【问题讨论】:

  • NOTREG 表示未正确注册。使用 SysInternals 的 ProcMon 进行诊断,您会看到它在注册表中搜索 guid。
  • 感觉要么是32位对64位的问题,要么是为所有人注册的和当前用户的问题。
  • 你的蜘蛛侠意识消失了,亚当。我检查了,一切都是 32 位的。
  • 我已安装并正在尝试使用 Process Manager 获取更多信息。到目前为止,即使在注册表中寻找 guid,也没有运气。我可能没有正确使用它。

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


【解决方案1】:

嗯,我发现了什么可行。

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

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

【讨论】:

  • 我也有类似的问题。我想试试你的解决方案,但是编译器找不到 CLSID_MyClass。
猜你喜欢
  • 2012-02-04
  • 1970-01-01
  • 1970-01-01
  • 2016-07-26
  • 2011-09-28
  • 1970-01-01
  • 2017-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多