有哪些原因會導致HRESULT:0x800704A6提示已經計劃系統關機,除了更新系統或瀏覽器?

vb.net中,我想通過按鈕打開瀏覽器,二重啟動時的流程是這樣的:先判斷是否已存在該瀏覽器對象,如果存在則marshal.releasecomobject(該對象),再重新創建該瀏覽器。看似沒有問題,但是實際操作時,

按下面的順序操作有時會報錯:點擊按鈕打開瀏覽器,關閉瀏覽器,再次點擊按鈕打開瀏覽器

錯誤信息:大意是COM組件在從IClassFactory中創建實例時失敗:0x800704A6已經計劃系統關機。

我在想是不是在創建時有其他線程在清除該組建。

(問題可能描述不太清= =)


合理猜測,當一個軟體(譬如IE)已經安裝完補丁決定要重啟的時候,他在重啟前就不想讓別的軟體去使用它的一部分(譬如說IE的ActiveX控制項),因為這樣會阻止重啟,而重啟才是最重要的。這個時候,你只要彈出對話框告訴用戶去重啟就好了。


你可以在遇到這個錯誤的時候去看看task manager,是不是iexplore.exe還存在。如果還存在的話就驗證了我的猜測:主程序無法預知IE需要多久才能關閉

IE默認是有2個進程的,64位父進程叫做frame process負責IE窗口啊、菜單、標籤頁管理等,32位子進程就叫做content process,也叫tab process,就是負責實際渲染頁面的進程。當你關閉程序時,父進程會同步發送一個WM_DESTROY的消息給所有子進程(包括了tab process)。作為關閉進程流程的一部分,ieframe.dll會讓所有的線程釋其對TravelLog(瀏覽歷史記錄)的引用,這個操作可能會以:RPC_E_CANTCALLOUT_ININPUTSYNCCALL(0x8001010D)失敗告終。詳細可以看:https://support.microsoft.com/en-us/help/131056/prb-synch-ole-call-fails-in-inter-process-thread-sendmessage

解決辦法應該是主程序先要和IE進程脫離,使你的程序不再是IE的父進程。

如果不是這個導致的話,你可以試試下面的註冊表:

HKEY_CURRENT_USERSoftwareMicrosoftInternet ExplorerMain DWORD : 「DisableFirstRunCustomize」 set to 1


推薦閱讀:

entity framework中怎麼通過lambda表達式生成sql語句的?
UWP應用為什麼比桌面應用要佔用相對較多的資源?
負責前後端開發,為什麼要學 C 語言?

TAG:MicrosoftWindows | 編程 | VisualBasic | C# | VBnet |