2012-11-20 89 views
1

我的程序是一個掛鉤到IE的運行實例的DLL。多年來它工作得很好。SHDocVw :: IShellWindowsPtr與IE8失敗? (錯誤0x80040154)

最近我撒其關閉,並運行它,但低於最後一行失敗,hr = 0x80040154

#import <mshtml.tlb>  rename("value", "theValue") rename("event", "theEvent") 
#import <shdocvw.dll> 

// .... 

SHDocVw::IShellWindowsPtr spSHWinds; 
HRESULT hr = m_spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows)); 

難道不管是IE7已經換成IE8?我應該在哪裏看?

我正在使用VS2008,如果有問題。

編輯補充

我沒有看到,這可能是一個32/64位的問題 - 它運行得很好,去年這個同一臺機器上。這已經改變(據我已經注意到)是IE瀏覽器的版本,從7到8

注意的賞金獵人的唯一的事:

我只能訪問這個系統幾(美國東部時間0:00左右),所以你可能得不到你的建議的快速回應,但我看着他們。

如果您認爲有些事情我應該檢查(例如註冊表值),請具體說明。

編輯補充:

我現在看到第一一次我打電話的CreateInstance,它返回0x80070002,0x80040154的不是。

+0

0x80040154是'班級未註冊'。也許是一個32/64位的問題? –

+1

您有'0x80040154'' REGDB_E_CLASSNOTREG'「類未註冊」錯誤。最有可能的是你沒有安裝這個組件。至少,這是首先要檢查的內容:如果你有任何這個'CLSID'的條目,並且它們指向一個健康的DLL,請查看註冊表。 –

+0

然後接下來的事情 - 如果DLL看起來很好 - 是創建一個空的項目,例如控制檯C++應用程序,它只是簡單地執行'CoInitialize'和'CoCreateInstance',即在IE之外,並運行它來查看是否可以實例化類。 –

回答

4

這將是非常難難以診斷。 ShellWindows coclass是特殊的,它的CLSID註冊表鍵是HKEY_CLASSES_ROOT\CLSID\{9BA05972-F6A8-11CF-A442-00A0C90A8F39}。當你在那裏看,你會看到沒有用的東西在那裏註冊。背景故事是,這是一個讓Windows外殼看起來像Web瀏覽器的嘗試失敗的遺留問題。枚舉shell窗口現在仍然可見,同時返回Windows資源管理器和Internet Explorer實例。

SysInternals的ProcMon實用程序幾乎總是調試0x80040154錯誤的首選武器,但它在這裏持平。你可以看到它探查註冊表,並沒有找到它正在尋找什麼,但然後該程序知道如何加載ieframe.dll無論如何。這隻能通過操作系統攔截CoCreateInstance()調用來工作。一般來說,考慮到coclass列舉了shell窗口,這是有道理的。

你剩下的只是試錯法。首先重新安裝IE,然後重新安裝OS。或者在它消耗了太多寶貴的時間之前將機器推出第四層窗戶。

+0

+1這實際上非常有用,因爲它可以幫助我解決一些死路。 – egrunin

+0

+1對於一些了不起的建議和第四層窗口。你總是有這麼棒的職位。 –