2

我正在学习 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 中(最后两个存根)

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)。我从教程中获得的源代码,所以我不明白出了什么问题。

4

1 回答 1

2

您发现的教程无疑是旧的,早在 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。

于 2013-10-13T10:54:59.287 回答