2011-09-04 66 views
1

我知道這個問題的通常原因與組件編譯到的平臺有關,並且我以前遇到過這個問題。然而,這是來自單個用戶的報告,並且在他嘗試打開對話以選擇文件或目錄時發生。我沒有使用任何花哨的組件,只是標準組件。在堆棧跟蹤的一個相關的線路有:COM類出廠錯誤80040154打開獲取目錄對話框

Retrieving the COM class factory for component with CLSID {DC1C5A9C-E88A-4DDE-A5A1-60F82A20AEF7} failed due to the following error: 80040154. at System.Windows.Forms.OpenFileDialog.CreateVistaDialog() at System.Windows.Forms.FileDialog.RunDialogVista(IntPtr hWndOwner) at System.Windows.Forms.FileDialog.RunDialog(IntPtr hWndOwner) at System.Windows.Forms.CommonDialog.ShowDialog(IWin32Window owner) at System.Windows.Forms.CommonDialog.ShowDialog() at ScruffyDuck.AirportDesignEditor.MainForm.getOpenFileInfo(String initialDirectory, String filter)

我搜索我的註冊表此CLSID與

%SystemRoot%\System32\comdlg32.dll

這是沒有一個驚喜,我想上來。我假設,因爲有許多其他用戶沒有這個問題,必須涉及到用戶設置。如果在這種情況下提出建議,我將不勝感激。

非常感謝

+0

您的應用程序是否在'MTAThread'中運行?查找'main()'方法,然後查看它的屬性,應該是'[MTAThread]'或'[STAThread]'。 – Cipi

+0

它在[STATThread]中一直是我們以前從未見過的。據我所知,它是由30,000左右的單個用戶報告的。 – ScruffyDuck

回答

3

我剛纔猜測,因爲這是沒有編程問題,所以不要-1我,如果我沒有幫助,只是給一些想法...:P

這裏的問題是,系統無法將COM對象從CLSID指定的COM類中取出。發生這種情況的原因有很多:

  • comdlg32.dll未註冊,請嘗試使用regsvr32 comdlg32.dll
  • 系統accont註冊它不具有對持有CLSID {DC1C5A9C-E88A-4DDE-A5A1-60F82A20AEF7}註冊表項的完全控制(許可)。您可以通過導航(或搜索註冊表)來檢查該密鑰,右鍵點擊該密鑰,並通過選擇Permissions...給SYSTEM帳戶完全控制它。
  • 嘗試上面的管理員帳戶。
  • comdlg32.dll已損壞。如果間諜軟件或其他惡意程序試圖將自己掛鉤到「打開文件」或「瀏覽目錄」對話框並因此修改了lib ...,則必須重新安裝lib ...或windows。檢查是否正確,使其MD5散列,並與工作系統上lib的MD5散列進行比較。它們應該是相同的。

那麼,希望我幫了忙。 :)

+0

regsvr32將無法工作,因爲comdlg32.dll不會導出DllRegisterServer(它是操作系統的一部分,應該永遠不需要獨立安裝)。我同意這不是一個編程問題,可能是一個損壞的操作系統安裝或一些不好的第三方。如果沒有其他工作,我會嘗試修復安裝Windows。 – eran

+0

@eran當然,這不是我的系統。我是對的,如果用戶在我的應用程序中遇到問題,那麼它也會出現在其他應用程序中? – ScruffyDuck

+0

@cipi非常感謝,這是有幫助的。我等待用戶回覆我的電子郵件,因爲這來自自動日誌上傳。很可能他的系統已經損壞。 – ScruffyDuck