HRESULT“未注册类”实现简单的COM服务器DLL

时间:2013-02-21 19:34:06

标签: c++ com regsvr32

我正在关注此站点教程:

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

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

我正在编写第3节中的示例。(实现服务器DLL)。我已经完全按照所示输入了代码,并且我得到了一个未注册的" Class"在第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时出错:

enter image description here

我已经跑了

 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

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

我假设需要将一个函数添加到允许注册的类中,但我不知道如何执行此操作以及如何进行计算。我有点失落,因为我已经和COM一起工作了很长时间。如果有人能给我一个正确方向的推动,那会很有帮助。

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

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

1 个答案:

答案 0 :(得分: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>

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

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

是的! COM仍然主要活着并且很好:)至少在VS 2012中仍然有标准的支持。

希望有所帮助。