2012-07-11 129 views
3

我有一個最初爲x86構建的C++ ATL COM DLL,由x86構建的.NET 4.0應用程序正在使用DLL,一切正常。無法正確註冊Windows 7上的x64 COM DLL x64

在爲x64重新編譯COM dll後,使用c:\windows\system32\regsvr32(un-reg x86 dll)註冊後,我無法在Visual Studio添加引用窗口中看到COM DLL,我導出了註冊表項HKCR和HKLM \ Softwares與x64和然後x86版本的DLL註冊,並沒有鍵丟失,各自的鍵指向正確的DLL位置。

此外,在註冊x64 dll之後,我可以通過導航到文件所在的文件夾並選擇它,但它仍然無法執行(.net程序集設置爲x64)並添加了對dll的引用,並且出現以下錯誤

System.Runtime.InteropServices.COMException (0x80040154): Retrieving the COM class factory for component with CLSID {00000000-0000-0000-0000-A797AD238051} failed due to the followi ng error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASS NOTREG)). at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolea n noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurity Check) at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boo lean fillCache) at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibil ityChecks, Boolean skipCheckThis, Boolean fillCache) at System.Activator.CreateInstance(Type type, Boolean nonPublic)

我已經花了大量的時間在網上搜索,但沒有發現任何遠程關閉,沒有人見過這樣的事,或任何調試工具我也許可以使用?

我不擁有dll,擁有它的人可以看到曾經在機器上構建過的x64 dll,但在其他兩臺機器上嘗試過,並且兩者都無法工作。

+1

沒有看到對話框中的組件是完全正常的,VS是一個32位的進程,所以只能看到32位的COM服務器。不要取消註冊您的x86版本。我無法跟隨其餘的。 – 2012-07-11 23:57:45

+0

x64的挑戰之一是[註冊表重定向器](http://msdn.microsoft.com/en-us/library/windows/desktop/aa384232(v = vs.85))。aspx)這有助於 - 有時太多。有可能一個註冊是踐踏另一個。 SysInternals [ProcMon](http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx)是很多情況下的好工具。在重現問題的同時監視註冊表,您可以看到真正正在讀取的註冊表項。 – 2012-07-12 04:05:55

+1

我也建議你通過將InteropServices從圖片中解放出來來簡化事情。使用C++構建簡單的32位和64位測試客戶端。在嘗試從託管代碼調用COM對象之前先讓那些工作正常。 – 2012-07-12 04:07:59

回答

0

這個問題很舊,我需要更多的信息才能完全排除故障。但是,我可能會爲在同一問題上運行的任何人提供一些提示。

鑑於您使用的是regsvr32,該DLL使用的是名爲self-registration的東西。這意味着DLL正在處理它自己添加到Windows註冊表中的導出函數DllRegisterServer。正如您似乎已經發現的,x86和x64的註冊表項不同,但這不一定是您的核心問題。您可以並經常應該同時註冊x86和x64類型的庫。

檢查特定類型庫註冊方式的一種方式是oleview工具。相同的信息在註冊表中,但此工具可能稍微友好一點。該工具應位於Visual Studio命令提示符處設置的路徑中。這聽起來像誤差約爲一個給定的GUID,您可以從Object類檢查類 - >樹中的所有對象:

Finding a class in the tree

如果你碰巧有類(你可以有要重新註冊要檢查的x86版本),可以通過展開剛剛找到的GUID條目來查找類實現的COM接口的信息。如果有類型庫,應該這樣說。注意,這裏既可以是win32win64條目的類型庫信息的路徑:

Example of interface with both win32 and win64 paths

沒有進一步的信息,也很難說,但我猜的東西是錯誤的自注冊和/或爲x64鍵入類型庫。順便說一下,對於您計劃發佈的庫,您可能不會依賴自行註冊 - 安裝程序包可以並且應該自己創建註冊表項。如果你有更多的信息,我可以嘗試提供更多細節。