【发布时间】: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位的问题,要么是为所有人注册的和当前用户的问题。
-
Raymond Chen 的超能力告诉我you registered the 32-bit version of XYZ.DLL on a 64-bit machine。
-
你的蜘蛛侠意识消失了,亚当。我检查了,一切都是 32 位的。
-
我已安装并正在尝试使用 Process Manager 获取更多信息。到目前为止,即使在注册表中寻找 guid,也没有运气。我可能没有正确使用它。
标签: c++ c#-4.0 com-interop