2012-05-28 144 views
4

之前重啓。如果我啓動安裝程序與MSIEXEC在安靜模式下,我可以檢測是否需要重新啓動通過檢查來完成安裝,如果退出代碼是3010,但希望我能夠以可編程形式執行測試是否安裝MSI需要重新啓動才能完成之前我啓動實際安裝程序。檢測是否需要MSI安裝

我在微星的API環顧四周:

http://msdn.microsoft.com/en-us/library/windows/desktop/aa369426(v=vs.85).aspx

我沒想到我能:

  1. 呼叫MsiOpenPackage讓安裝程序就可以運行
  2. 呼叫MsiDoAction與以下內容:CostInitialize,FileCost,CostFinalize,InstallValidate
  3. 從FilesInUse表中讀取記錄(下表在MSDN上翼文檔表明,這臺正在運行CostFinalize/InstallValidate之後創建的:

http://msdn.microsoft.com/en-us/library/aa369546(VS.85).aspx

但該表實際上並沒有出現,當我在安裝過程中查詢其存在。是否有其他方法來檢查是否需要重新啓動?

回答

2

決定最終只會在安裝過程中自行完成。正如你所知道的,它依賴於DLLs被同時運行的應用程序鎖定的情況,因此它非常不穩定。

有沒有辦法將你保證,你將不會收到退出代碼3010的實際安裝完成後。

這就是說,退出代碼不緊密綁定到正在使用的文件。它也可能表明無法停止某項服務或者其他暫時或永久的狀況。在嘗試之前,您無法瞭解是否可以停止服務。

+0

這很有道理 - 用戶可以在安裝啓動並導致問題後啓動應用程序。 –

1

爾卡是對有關的波動是需要重新啓動 - 各種事情可能在安裝過​​程中發生的。

不過,我想我得靠近想什麼,我能夠用不同的方法去做:

  1. 註冊外部用戶界面處理程序INSTALLLOGMODE_RMFILESINUSE
  2. 捕捉INSTALLMESSAGE_RMFILESINUSE消息
  3. 如果我捕捉任何INSTALLMESSAGE_RMFILESINUSE的消息,返回-1,並退出安裝任何文件拷貝進行

之前,這樣我可以嘗試SI借給軟件後臺安裝,但如果由於任何原因,它看起來像我將無法完成安裝,我可以阻止。我想我可以使用MsiBeginTransaction和MsiEndTransaction函數進行回滾,如果我最終處於用戶開始複製後鎖定文件的狀態。

4

加雷,理論上你不需要執行實際的安裝,你應該只執行的動作,直到InstallValidate(含稅),因爲那時出現在文件正在使用的消息。但是,當使用外部UI處理程序執行安裝時,Windows安裝程序可能會有一些不同,因此應該進行測試。

+0

我想我已經嘗試了一系列CostInitialize,FileCost,CostFinalize,InstallValidate - 但我不認爲我得到了所需的回調。我可能需要通過InstallExecuteSequence表並確保eveything正在正確設置。 –