2013-10-13 92 views
1

我正在學習COM的基礎知識,所以我嘗試在VS2010 C++ Windows 7中編寫簡單的COM組件。 我爲組件創建了dll,使用以下REG-file註冊它:在我自己的COM組件上沒有註冊的類(0x80040154)

REGEDIT 
HKEY_CLASSES_ROOT\Math.Component.1 = Chapter 6 Math Component 
HKEY_CLASSES_ROOT\Math.Component.1\CurVer = Math.Component.1 
HKEY_CLASSES_ROOT\Math.Component.1\CLSID = {A888F560-58E4-11d0-A68A-0000837E3100} 

HKEY_CLASSES_ROOT\CLSID\{A888F560-58E4-11d0-A68A-0000837E3100} = Chapter 6 Math Component 
HKEY_CLASSES_ROOT\CLSID\{A888F560-58E4-11d0-A68A-0000837E3100}\ProgID = Math.Component.1 
HKEY_CLASSES_ROOT\CLSID\{A888F560-58E4-11d0-A68A-0000837E3100}\VersionIndependentProgID = Math.Component 
HKEY_CLASSES_ROOT\CLSID\{A888F560-58E4-11d0-A68A-0000837E3100}\InprocServer32 = D:\Proga\COM\Debug\server.dll 
HKEY_CLASSES_ROOT\CLSID\{A888F560-58E4-11d0-A68A-0000837E3100}\NotInsertable 

在DLL我出口(去年兩個stub)

DllGetClassObject  
DllCanUnloadNow  
DllRegisterServer  
DllUnregisterServer 

在我的COM客戶CLSIDFromProgID(szWideProgID, &clsid);按預期工作,返回{A888F560-58E4-11d0-A68A-0000837E3100}

但是,當我嘗試訪問IClassFactory REGDB_E_CLASSNOTREG CoGetClassObject(clsid, CLSCTX_INPROC, NULL, IID_IClassFactory, (void **)&pCF)我得到(0x80040154)錯誤。

爲Win32目標平臺編譯的服務器和客戶端(儘管我也嘗試過x64)。源代碼我從教程中獲得,所以我不明白什麼是錯的。

+1

爲什麼不使用regsvr32.exe來註冊你的組件? –

+0

機會很高,它是Win32/x64的問題,但是因爲你似乎從一開始就構建它,所以有許多方法可以打破它。沒有證據表明您甚至有CLSID的班級工廠。發佈更多的代碼,包括服務器和客戶端。如果你使用的是64位系統,那麼對於初學者來說,在64位域中做所有事情都是有意義的。 –

回答

1

您發現的教程無疑是舊的,早在64位Windows出現之前就已經寫好了。註冊表項需要寫入32位COM服務器的HKLM \ Software \ Wow6432Node \ Classes,以及64位COM服務器的HKLM \ Software \ Classes。你的.reg文件不會處理這個問題。您必須避免HKEY_CLASSES_ROOT別名並將其替換爲明確的HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Classes以避免意外。

如果仍然有問題,請使用SysInternals的ProcMon實用程序,您將看到您的測試程序正在搜索註冊表項和DLL。

相關問題