c++ - 我自己的 COM 组件上未注册类 (0x80040154)

标签 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 中(最后两个的 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/

相关文章:

c++ - 子类会影响虚拟方法的可见性吗?

c++ - 在 Windows 上重定向标准输出/标准错误

c++ - ldd找不到库

Linux 上运行的 Python Pyro 在远程 windows 机器上打开一个 COM 对象,可能吗?

c# - P/调用第三方弹窗

c# - 从 C# 访问 C DLL 结构中的数组

c++ - 如何使用 dll 将 C++ 类库导出到 C#?

C# - EasyHook CoCreateInstance

c++ - Windows Embedded Compact 7上发生意外的IConnectionPointImpl::Unadvise调用

c++ - 为什么 OnKeyDown 不捕获基于对话框的 MFC 项目中的按键事件?