C++ 未注册的类别

C++ 未注册的类别,c++,com,visual-studio-2005,C++,Com,Visual Studio 2005,我正在通过Andrew W.Troelsen的“COM和ATL 3.0开发者研讨会”工作 我试图实现第三章中的实验室 它向您展示了如何构建一个COM客户端,以连接到在早期实验室中开发的进程内COM服务器 当我运行客户端时,调用'CoGetClassObject'时收到错误“Class not registered” 下面是一段代码: // Get the class factory pointer of CoCar. hr = CoGetClassObject(CLSID_CoCar, CLSC

我正在通过Andrew W.Troelsen的“COM和ATL 3.0开发者研讨会”工作

我试图实现第三章中的实验室

它向您展示了如何构建一个COM客户端,以连接到在早期实验室中开发的进程内COM服务器

当我运行客户端时,调用'CoGetClassObject'时收到错误“Class not registered”

下面是一段代码:

// Get the class factory pointer of CoCar.
hr = CoGetClassObject(CLSID_CoCar, CLSCTX_INPROC_SERVER, NULL, IID_IClassFactory, (void**)&pCF);

if(SUCCEEDED(hr))
{
    // Make a CoCar & get ICreateCar
    hr = pCF->CreateInstance(NULL, IID_ICreateCar, (void**)&pICreateCar);
    pCF->Release();
}
else
{
    char buff[100];
    BOOL bRet = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, hr, 0, buff, sizeof(buff), 0);
    std::cout << buff << std::endl;
}
不确定这是否相关,但这是我的.def文件:

LIBRARY "CarInProcServer"
EXPORTS
DllGetClassObject   @1  PRIVATE
DllCanUnloadNow     @2  PRIVATE
注意:我使用的是Windows7

有人能帮忙吗

谢谢


明白了

我手动添加了:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID{EFC76CF8-71B8-477b-890A-1233BD9177CB} \InprocServer32=“C:\Users\Steven\Documents\visualstudio 2005\Projects\CarInProcServer\release\CarInProcServer.dll”

到登记处


将.reg文件与其中的此条目合并似乎不起作用。感谢肯·怀特的帮助。(以及其他建议解决方案的人)

是否尝试使用regsvr32.exe注册COM服务器?

打开命令提示符,更改到DLL文件夹,然后运行regsvr32.exe:

cd \Users\Steven\Documents\Visual Studio 2005\Projects\CarInProcServer\release 
regsvr32 CarInProcServer.dll

CLSID_CoCar的值是否等于reg文件中的值?({EFC76CF8-71B8-477b-890A-1233BD9177CB}),或者它们是否已重新生成为不同的值

如果是,您是否已检查这些值是否已正确合并到您的注册表中


你给CoInitialize打过电话吗?

我试过这个,但运气不好。我认为作者打算使用这个reg文件来代替书中提到的regsvr32和DllRegisterServer():“我们将编写自己的注册表脚本(reg文件),它可以用来自动将服务器信息合并到注册表中,而无需编写DllRegisterServer()手动。Steven,我不明白你为什么要绕过DllRegisterServer,除非这只是一个早期的例子,只是为了让事情顺利进行……问题可能是Vista或Win7上的版权问题。我注意到你的注册表文件正在写入HKCR;这是Win7 64位吗?如果是,该配置单元是针对32位应用程序(和DLL)虚拟化的。搜索“WOW_64 registry”,您应该可以找到一些关于如何解决此问题的帖子。HKCR不能为标准编写(非管理员)Vista或Win7上的用户;您是否在管理员帐户下运行时导入了reg文件?听起来好像设置已正确地合并到注册表中-请参见下面他的评论@@bacar:该评论必须在上面我的评论之后发布。但它仍然可能是虚拟化的结果。从未获得关于管理员帐户的答案,或者它是否是64位Windows上的32位DLL。我已检查,并且GUID在服务器和注册表中匹配。我在客户端的main开头调用了“CoInitialize(NULL);”。
cd \Users\Steven\Documents\Visual Studio 2005\Projects\CarInProcServer\release 
regsvr32 CarInProcServer.dll