班级未注册

Ste*_*ith 1 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_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;
}
Run Code Online (Sandbox Code Playgroud)

我尝试通过将以下 .reg 文件与系统注册表合并来注册该类:

REGEDIT
HKEY_CLASSES_ROOT\CarInProcServer.CoCar\CLSID = {EFC76CF8-71B8-477b-890A-1233BD9177CB}
HKEY_CLASSES_ROOT\CLSID\{EFC76CF8-71B8-477b-890A-1233BD9177CB} = CarInProcServer.CoCar
HKEY_CLASSES_ROOT\CLSID\{EFC76CF8-71B8-477b-890A-1233BD9177CB}
\InprocServer32 = C:\Users\Steven\Documents\Visual Studio 2005\Projects\CarInProcServer\release\CarInProcServer.dll
Run Code Online (Sandbox Code Playgroud)

不确定这是否相关,但这是我的 .def 文件:

LIBRARY "CarInProcServer"
EXPORTS
DllGetClassObject   @1  PRIVATE
DllCanUnloadNow     @2  PRIVATE
Run Code Online (Sandbox Code Playgroud)

注意:我使用的是 Windows 7

有人可以帮忙吗?

谢谢


知道了!

我手动添加:

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 文件与其中的此条目合并不起作用。感谢肯·怀特的帮助。(以及其他提出解决方案的人)

Ken*_*ite 5

打开命令提示符,切换到 DLL 的文件夹,然后运行 ​​regsvr32.exe:

cd \Users\Steven\Documents\Visual Studio 2005\Projects\CarInProcServer\release 
regsvr32 CarInProcServer.dll
Run Code Online (Sandbox Code Playgroud)

  • 该问题可能是 Vista 或 Win7 上的权限问题。我注意到您的 reg 文件正在写入 HKCR;这是偶然的Win7 64位吗?如果是这样,则该配置单元针对 32 位应用程序(和 DLL)进行虚拟化。搜索“WOW_64 注册表”,您应该找到一些有关如何解决此问题的帖子。HKCR 对于 Vista 或 Win7 上的标准(非管理员)用户来说也是不可写的;您是否在管理员帐户下运行时导入了 reg 文件? (3认同)