C++ 未注册的类别

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

我正在通过Andrew W.Troelsen编写的COM和ATL 3.0开发者研讨会进行工作

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

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

当我运行客户端时,我在调用“CoGetClassObject”时收到未注册的错误类

下面是一段代码:

// 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\Visual Studio 2005\Projects\CarInProcServer\release\CarInProcServer.dll

到登记处


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

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

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

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

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

打开命令提示符,更改到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?

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

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


你给CoInitialize打过电话吗?

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