2014-02-06 54 views
2

我有一個Windows服務,可以在特定事件中重新啓動Windows,但我遇到問題。我不想在使用Windows安裝程序安裝程序時重新啓動Windows。如何找出Windows安裝程序是否忙或不使用delphi?

因此,我可以確定Windows安裝程序是否正在安裝某些東西。

任何Delphi或命令行函數都是可以接受的。

你能幫我嗎?

我發現了這兩個classess,但我不知道如何使用它們。

Class1class2

回答

2

基於this article,這是相當過時的我試圖實現這兩個建議方案。第二個在Windows 7 SP1上爲我工作。原則是查詢MSIServer服務狀態並檢查該服務是否正在運行並且接受SERVICE_ACCEPT_STOP控制代碼。下面是一個函數包裝:(有關目標和具體情況的一些細節本來不錯)

uses 
    WinSvc; 

function IsWindowsInstallerBusy: Boolean; 
var 
    Service: SC_HANDLE; 
    ServiceMgr: SC_HANDLE; 
    ServiceStatus: SERVICE_STATUS; 
begin 
    Result := False; 

    ServiceMgr := OpenSCManager(nil, nil, SC_MANAGER_CONNECT); 
    if ServiceMgr <> 0 then 
    try 
    Service := OpenService(ServiceMgr, 'MSIServer', SERVICE_QUERY_STATUS); 
    if Service <> 0 then 
    try 
     if QueryServiceStatus(Service, ServiceStatus) then 
     begin 
     Result := (ServiceStatus.dwCurrentState = SERVICE_RUNNING) and 
      ((ServiceStatus.dwControlsAccepted and SERVICE_ACCEPT_STOP) = 0); 
     end 
     else 
     raise Exception.CreateFmt('Cannot query service status. Code: %d', 
      [GetLastError]); 
    finally 
     CloseServiceHandle(Service); 
    end 
    else 
     raise Exception.CreateFmt('Cannot open service. Code: %d', 
     [GetLastError]); 
    finally 
    CloseServiceHandle(ServiceMgr); 
    end 
    else 
    raise Exception.CreateFmt('Cannot connect to the service control ' + 
     'manager. Code: %d', [GetLastError]); 
end; 
+0

雖然文章已經過時,但它仍然是我說的最可靠的來源。它由Windows Installer團隊編寫。 – TLama

+0

這一個爲我工作,你非常坦克 – Zeid

+0

在這篇文章的評論是希思斯圖爾特的寶石,說繼續使用互斥體。希斯知道他的東西。 –

0

我只是猜測這裏因爲你沒有提供足夠的信息...


1)如果你想重新啓動只有當特定的安裝程序沒有運行,您應該枚舉正在運行的進程的窗口,如果你發現安裝程序你想知道只是不要重新啓動你的系統。

2)如果您希望更廣義的解決方案,你仍然有一個選擇:該類型的.msi安裝使用msiexec.exe的。如果您希望知道這種類型的安裝程序,則可以搜索正在運行的進程的列表。


資源:

+0

枚舉問題是這樣的:當MSI軟件包沒有開始安裝msiexec.exe而沒有運行但安裝完成時msiexec.exe仍在運行枚舉對此沒有幫助。 – Zeid

+1

那麼,這取決於你的「它[Windows]安裝程序使用Windows安裝程序」的定義。我認爲雖然msiexec.exe未啓動,但安裝未啓動。無論如何,TLama的答案比我的更正確。 – mg30rg

2

Windows安裝程序提供了一個mutex告訴你,如果安裝過程。我會在SCManager API調用中使用它,因爲它是線程安全的。希斯·斯圖爾特(MSFT MSI專家)寫了關於它的文章here,他的建議應該給予Windows Installer團隊更高的可信度。

+0

那麼,你有沒有嘗試過這種技術?我可以看到由msiexec.exe進程創建的唯一互斥量是Process Explorer中的\ Sessions \ 1 \ BaseNamedObjects \ MSCTF.Asm.MutexDefault1。所以即使它可能更可信,它仍然是8年前的文章,而且從那時起許多文章可能會發生變化。 MSI的文檔是災難性的。 [Windows 7 SP1] – TLama

+0

我已經做了17年的安裝程序和11年的Windows安裝程序。無論好壞,MSI在幾年內都沒有改變。他們在這裏和那裏增加了一點點,但他們非常非常注重向後兼容性,並且變化緩慢。互斥體是有效的,並且在MSI處於執行序列時被創建。 UI序列不會創建互斥鎖,因爲客戶端不會執行安裝。 –

+0

+1這感覺就像是正確的解決方案 –

相關問題