2011-08-25 102 views
35

從64位Windows遷移工作C#項目7機32位XP的機器引起以下錯誤:如何修復COMException錯誤80040154?

Retrieving the COM class factory for component with CLSID {681EF637-F129-4AE9-94BB-618937E3F6B6} failed due to the following error: 80040154.

681EF637-F129-4AE9-94BB-618937E3F6B6是不是在註冊表中,所以它不是正確安裝,但這是以前在64位Windows 7計算機上出現問題的相同ID。在64位Windows 7機器上發現此錯誤的解決方案被發現here(將Platform Target更改爲x86),但這並不能解決32位XP機器上的問題。如何找到與681EF637-F129-4AE9-94BB-618937E3F6B6相關的DLL,或者,更好的辦法是如何修復此異常?

+0

據我所知,進程(64或32)無法加載32位dll(分別爲32或64)。 – Arun

+0

請注意,錯誤代碼是REGDB_E_CLASSNOTREG。因此,當計算機上未安裝COM/ActiveX控件或未安裝該進程的位時,可能會發生這種情況。 –

回答

20

要找到DLL,請轉到您的64位計算機並打開註冊表。找到名爲HKEY_CLASSES_ROOT\CLSID\{681EF637-F129-4AE9-94BB-618937E3F6B6}\InprocServer32的鑰匙。該鍵將以該DLL的文件名作爲其默認值。

如果您通過重新編譯x86項目的項目解決了64位機器上的問題,那麼您需要查看註冊表的32位部分,而不是正常位置。這是HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{681EF637-F129-4AE9-94BB-618937E3F6B6}\InprocServer32

如果DLL是爲32位構建的,那麼您可以直接在32位機器上使用它。如果它的內置64位,那麼你必須聯繫供應商,並從他們那裏獲得一個32位版本。

當您有DLL時,通過運行c:\ windows \ system32 \ regsvr32.exe來註冊它。

11

我在Windows服務中遇到同樣的問題。所有的鍵都在註冊表的正確位置。服務的構建是爲x86完成的,我仍然有例外。我發現了約CorFlags.exe

運行此service.exe沒有標誌,以驗證您是否運行在32位。如果未使用該標誌/32BIT+ /Force (只隊簽名的程序集)

運行它,如果你已經打開UAC可以得到以下錯誤:corflags : error CF001 : Could not open file for writing給用戶在組件的完全控制。

Console output

+0

你能澄清一下 - 圖像標誌應該是什麼樣的截圖?或者截圖情況是什麼給你帶來了問題?我得到了海報的COMException,並且我的可執行文件具有與屏幕截圖中完全相同的標誌。 –

+0

@CalvinFisher這是截圖應該如何。 (就我而言) –

7

解決方法:

可能的解決辦法是修改你的項目的平臺, '任何CPU' 到 'X86'(以項目的屬性,構建/平臺的目標)

根本原因

VSS Interop是一個使用32位框架的託管程序集,並且該DLL包含一個32位COM對象。如果您在64位環境中運行此COM DLL,您將收到錯誤消息。

-2

移動Excel,這些在你的形式,對當地全局聲明就像在我的表單中我有變量:

Dim xls As New MyExcel.Interop.Application 
Dim xlb As MyExcel.Interop.Workbook 

上面的兩行聲明在我的表格全球化,所以我提出這兩條線到本地功能和現在工具工作正常。