我正在学习 COM 基础知识,因此我尝试在 VS2010 C++ Windows 7 中编写简单的 COM 组件。 我为组件创建了 dll,并使用以下 REG 文件注册了它:
REGEDIT
HKEY_CLASSES_ROOT\Math.Component.1 = Chapter 6 Math Component
HKEY_CLASSES_ROOT\Math.Component.1\CurVer = Math.Component.1
HKEY_CLASSES_ROOT\Math.Component.1\CLSID = {A888F560-58E4-11d0-A68A-0000837E3100}
HKEY_CLASSES_ROOT\CLSID\{A888F560-58E4-11d0-A68A-0000837E3100} = Chapter 6 Math Component
HKEY_CLASSES_ROOT\CLSID\{A888F560-58E4-11d0-A68A-0000837E3100}\ProgID = Math.Component.1
HKEY_CLASSES_ROOT\CLSID\{A888F560-58E4-11d0-A68A-0000837E3100}\VersionIndependentProgID = Math.Component
HKEY_CLASSES_ROOT\CLSID\{A888F560-58E4-11d0-A68A-0000837E3100}\InprocServer32 = D:\Proga\COM\Debug\server.dll
HKEY_CLASSES_ROOT\CLSID\{A888F560-58E4-11d0-A68A-0000837E3100}\NotInsertable
在我导出的 dll 中(最后两个的 stub )
DllGetClassObject
DllCanUnloadNow
DllRegisterServer
DllUnregisterServer
在我的 COM 客户端中 CLSIDFromProgID( szWideProgID, &clsid );
按预期工作,返回 {A888F560-58E4-11d0-A68A-0000837E3100}
。
但是当我尝试访问 IClassFactory REGDB_E_CLASSNOTREG CoGetClassObject(clsid, CLSCTX_INPROC, NULL, IID_IClassFactory, (void **)&pCF)
时,我收到 (0x80040154) 错误。
服务器和客户端都是针对 Win32 目标平台编译的(尽管我也尝试过 x64)。我从教程中获得的源代码,所以我不明白哪里出了问题。
最佳答案
毫无疑问,您会发现该教程很旧,是在 64 位 Windows 出现之前很久编写的。对于 32 位 COM 服务器,注册表项需要写入 HKLM\Software\Wow6432Node\Classes;对于 64 位 COM 服务器,需要写入 HKLM\Software\Classes。您的 .reg 文件不会处理这个问题。您必须避免使用 HKEY_CLASSES_ROOT 别名,并将其替换为显式 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes 以避免意外。
如果仍有问题,请使用 SysInternals 的 ProcMon 实用程序,您将看到测试程序正在搜索注册表项和 DLL。
关于c++ - 我自己的 COM 组件上未注册类 (0x80040154),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19343951/