我自己的COM组件上没有注册类(0x80040154)

时间:2013-10-13 10:04:26

标签: c++ dll com registry

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

1 个答案:

答案 0 :(得分:2)

你发现的教程毫无疑问是 old ,早在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。