2009-11-23 159 views
1

我正在通過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的幫助。 (和其他人建議的解決方案)

回答

4

打開命令提示符,更改爲DLL的文件夾,然後運行regsvr32.exe的:

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

我試過了,沒有運氣。我認爲作者打算使用這個reg文件來代替regsvr32和DllRegisterServer()根據這本書:「我們將編寫我們自己的註冊表腳本(REG文件),它可以用來將我們的服務器信息自動合併到註冊表中,繞過需要手工編寫DllRegisterServer() – 2009-11-23 19:00:32

+1

Steven,不明白爲什麼你想繞過DllRegisterServer,除非這只是一個早期的例子,只是爲了讓事情滾動... – bacar 2009-11-23 19:49:52

+3

問題可能是一個權利問題在Vista或Win7上。我注意到你的reg文件正在寫給HKCR;這是偶然的Win7 64位?如果是這樣,該配置單元已針對32位應用程序(和DLL)進行了虛擬化。搜索「WOW_64註冊表」,你應該找到一些關於如何解決這個問題的文章。對於Vista或Win7上的標準(非管理員)用戶,HKCR是不可寫的;您是否在管理員帳戶下運行時導入了reg文件? – 2009-11-23 19:54:41

2

您是否嘗試使用regsvr32.exe註冊COM服務器?

0

是CLSID_CoCar等於在你的reg文件的價值的價值? ({EFC76CF8-71B8-477b-890A-1233BD9177CB}),還是重新生成了不同的值?

如果是這樣,你檢查了這些值已正確合併到您的註冊表?

你有沒有叫CoInitialize?

+0

我檢查過了,服務器和註冊表中的GUID匹配。 我叫'CoInitialize(NULL);'在主客戶端開始。 – 2009-11-23 20:12:29