2010-09-07 32 views
0

我有安裝產品的MSI安裝程序,該產品有幾個廣泛使用的API DLL。 這些DLL可能會被加載到升級過程中無法控制的進程中(例如,我無法要求用戶關閉explorer.exe或svchost)。 因此,在MSI升級過程中,這些dll被鎖定,無法重新啓動就無法升級。我需要在不重啓的情況下進行升級。 這些API dll是非常穩定的,並且當新版本的這些dll被加載到新的正在運行的進程中時,可以保留舊的進程在舊進程中工作。 因此,當我們沒有使用MSI時,我們只是使用標準技巧 - 重命名文件,將其標記爲在重新引導時刪除,寫入新文件。如何告訴MSI升級鎖定的DLL並避免重新啓動

如何在MSI中執行此操作的最佳方法是什麼? 我應該創建自定義操作來完成這個標準技巧嗎? 或者也許MSI有更好的方法來做到這一點?

謝謝!

回答

1

進程被「鎖定」,因爲它們正在使用中,並且在運行時不能更改可執行文件;沒有「解鎖」,而是停止使用該文件。因此,要麼現在終止進程,要麼使用PendingFileRename鍵在重新啓動後更改文件...

您也許可以嘗試殺死explorer.exe等人必須保存在DLL中的句柄/線程(使用這可能會工作一分鐘......但是這樣可以確保(a)新升級的DLL在重新啓動之前不會工作,並且(b)您可能使用戶的計算機不穩定並且Explorer可能隨時崩潰。無論哪種方式,最終用戶都不會對您的軟件感到滿意......必須比他們不得不重新啓動時更爲惱火。

+1

這不完全正確。正如我在第一篇文章中所說的,我可以將舊的dll加載到舊的進程中。只有新的會使用新的DLL。 – Oleg 2010-09-08 15:26:50

+0

你的意思是新的DLL使用新名稱和新鉤子?嗯... – ewall 2010-09-08 16:01:56

相關問題