我正在通過Andrew W. Troelsen的「COM和ATL 3.0的開發人員研討會」。類未註冊
我想實現第3章
實驗室它表明你如何建立一個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;
}
我試圖通過與系統註冊表合併以下.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:\用戶\史蒂芬\文件\的Visual Studio 2005 \ Projects \ CarInProcServer \ release \ CarInProcServer.dll「
到註冊表。
它似乎合併.reg文件與此條目中沒有工作。感謝Ken White的幫助。 (和其他人建議的解決方案)
我試過了,沒有運氣。我認爲作者打算使用這個reg文件來代替regsvr32和DllRegisterServer()根據這本書:「我們將編寫我們自己的註冊表腳本(REG文件),它可以用來將我們的服務器信息自動合併到註冊表中,繞過需要手工編寫DllRegisterServer() – 2009-11-23 19:00:32
Steven,不明白爲什麼你想繞過DllRegisterServer,除非這只是一個早期的例子,只是爲了讓事情滾動... – bacar 2009-11-23 19:49:52
問題可能是一個權利問題在Vista或Win7上。我注意到你的reg文件正在寫給HKCR;這是偶然的Win7 64位?如果是這樣,該配置單元已針對32位應用程序(和DLL)進行了虛擬化。搜索「WOW_64註冊表」,你應該找到一些關於如何解決這個問題的文章。對於Vista或Win7上的標準(非管理員)用戶,HKCR是不可寫的;您是否在管理員帳戶下運行時導入了reg文件? – 2009-11-23 19:54:41