2011-08-08 14 views
1

我有一個安裝程序,提示用戶在安裝後重新啓動計算機。在這種情況下,我寧願不讓用戶重新啓動計算機,並讓explorer.exe使用隨Windows Vista及更高版本提供的RestartManager API自行重新啓動。如何使用RestartManager通過Windows Installer自定義操作重新啓動explorer.exe?

我已經創建了一個單獨的可執行文件,在安裝過程中將其複製到本地計算機,並在此之後運行。單獨的可執行文件註冊explorer.exe,將其關閉,然後根據以下代碼重新啓動它:http://msdn.microsoft.com/en-us/library/aa373681%28v=VS.85%29.aspx。當可執行文件與安裝程序分開運行時,它可按設計工作。但是,當它作爲使用InstalShield創建的MSI包的一部分的自定義操作運行時,它會關閉explorer.exe,但不會重新啓動它。

當它與安裝程序一起運行時,我總是得到RmRestart的160錯誤代碼。文檔說這是一個錯誤代碼,意味着提供了無效的參數。 (http://msdn.microsoft.com/en-us/library/aa373665%28v=vs.85%29.aspx)。我非常肯定我的參數不是無效的,因爲它們在可執行文件獨立於Windows Installer運行時工作。

我被困在這一點,不知道還有什麼可以做到這一點。我唯一不確定的是如果「0」可以是從RmStartSession()返回的錯誤代碼爲0(成功)的適當會話句柄。假設這是錯誤的,我建立我的可執行文件,以便在InstallValidate之前接受由Windows安裝程序創建的RmSessionKey。我用它來調用我的可執行文件作爲延期操作。在這種情況下,我收到RcShutdown的錯誤4c3,這似乎是一個無效的錯誤代碼。

懸崖:有單獨的.exe使用RestartManager API關閉,重新啓動explorer.exe,它不與Windows Installer一起運行時工作,但在組合時會中斷。查看RmRestart()的錯誤代碼160。試着想出這個想法,跑出想法。我可以提供代碼片段,如果人們想...

感謝您的任何建議/意見。

回答

1

我最終達成了一個解決這個...

而不是創建一個獨立的可執行文件,登記的explorer.exe,並關閉它,創建一個MSI DLL自定義操作。所有這個DLL必須具有的一個功能是註冊explorer.exe以重新啓動並使用Windows Installer提供的現有重啓管理器會話(默認情況下)。然後在你的安裝程序中,添加MsiFilesInUse對話框,你會很好。

現在當安裝程序運行時,它會啓動重新啓動管理器會話,並調用您的MSI DLL CA,並將explorer.exe添加到列表中。該列表得到顯示,用戶可以選擇關閉或延遲關閉應用程序。

使用此方法可以避免必須向用戶分發無意義的可執行文件,以及簡化大量編寫的代碼。

相關問題