我正在通过Andrew W. Troelsen的“开发人员研讨会到COM和ATL 3.0”工作。
我正在尝试在第3章实施该实验。
它向您展示了如何构建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;
}
我试图通过将以下.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
不确定这是否相关,但这是我的.def文件:
LIBRARY "CarInProcServer"
EXPORTS
DllGetClassObject @1 PRIVATE
DllCanUnloadNow @2 PRIVATE
注意:我正在使用Windows 7
有人可以帮忙吗?
由于
知道了!
我手动添加:
HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \类\ CLSID {EFC76CF8-71B8-477b-890A-1233BD9177CB} \ InprocServer32 =“C:\ Users \ Steven \ Documents \ Visual Studio 2005 \ Projects \ CarInProcServer \ release \ CarInProcServer.dll”
到注册表。
似乎将.reg文件与此条目合并在一起无法正常工作。感谢Ken White的帮助。 (以及其他提出解决方案的人)
答案 0 :(得分:4)
打开命令提示符,切换到DLL的文件夹,然后运行regsvr32.exe:
cd \Users\Steven\Documents\Visual Studio 2005\Projects\CarInProcServer\release
regsvr32 CarInProcServer.dll
答案 1 :(得分:2)
您是否尝试使用regsvr32.exe注册COM服务器?
答案 2 :(得分:0)
CLSID_CoCar的值是否等于reg文件中的值? ({EFC76CF8-71B8-477b-890A-1233BD9177CB}),还是将它们重新生成为不同的值?
如果是这样,您是否检查过这些值是否已正确合并到注册表中?
你有没有打电话给CoInitialize?