2

我正在关注这个网站教程:

http://progtutorials.tripod.com/COM.htm

初步证据:Visual Studio 2010,Windows 7 64 位。

我正在编写第 3 节中的示例。(实现服务器 DLL)。我已经完全按照所示输入了代码,并且在第 4.1 节中概述的代码的第 12 行执行此代码时出现“类未注册”异常(本教程向您展示了如何访问 DLL,我有遵循 3.1 至信):

 hresult hr = CoGetClassObject(CLSID_Car, CLSCTX_SERVER, NULL, IID_IClassFactory, (void **) &pClassFactory);

我尝试运行:

 regsvr32 xyz.dll 

xyz.dll 是我的 dll 的路径,以便注册 DLL。这导致尝试查找 DLLRegisterServer 时出错:

在此处输入图像描述

我已经跑了

 REGEDIT
 HKEY_CLASSES_ROOT\CarDLL.Car\CLSID = {d969084c-b758-43ea-a218-a48763167abd}
 HKEY_CLASSES_ROOT\CLSID\{d969084c-b758-43ea-a218-a48763167abd} = CarDLL.Car
 HKEY_CLASSES_ROOT\CLSID\{d969084c-b758-43ea-a218-a48763167abd}\InProcServer32 = C:\Users\wiocl2\Documents\Visual Studio 2010\Projects\CarDLL\debug\CarDLL.dll

我假设将我需要的所有 GUIDS 都放在注册表中(GUIDS 是由我生成的)。

我假设需要将一个函数添加到允许它注册的类中,但我不知道如何执行此操作以及如何解决它。我有点迷茫,因为我已经很久没有使用 COM 了。如果有人可以在正确的方向上推动我,那将很有帮助。

编辑:哦,是的,我移动了#include // 包含 DEFINE_GUID 的定义

从 iid.cpp 到 iid.h 文件,否则我在构建时遇到未解决的外部错误。

4

1 回答 1

1

最可能的解释:您将 COM 对象构建为 32 位 DLL,但注册已作为 64 位 DLL 执行。

处理方法:打开一个管理员权限的命令窗口并导航到 DLL 的位置(C:\Users\wiocl2\Documents\Visual Studio 2010\Projects\CarDLL\debug)。在那里,输入:

c:\windows\sysWOW64\regedit <filename of .reg file whose contents are displayed above>

这将运行 REGEDIT 的 32 位版本,确保在配置单元的正确部分创建注册表项。要验证这一点,您应该{d969084c-b758-43ea-a218-a48763167abd}在 HKLM\Software\Wow6432Node\Classes\CLSID 中看到一个条目,而不是HKLM\Software\Classes\CLSID。

DllRegisterServer是您可以在 COM 服务器 DLL 中实现的一种方法,如果您想使用它regsvr32来执行当前使用 .REG 方法的相同操作,则该方法是必需的。同样的警告适用:对于 32 位 DLL,您需要调用c:\windows\sysWOW64\regsvr32.exe.

是的!COM大部分仍然存在并且运行良好 :) 至少在 VS 2012 中仍然有对它的标准支持。

希望有帮助。

于 2013-05-10T19:28:48.133 回答