我正在关注此站点教程:
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时出错:
我已经跑了
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文件,否则我在构建时遇到了未解决的外部错误。
答案 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中仍然有标准的支持。
希望有所帮助。