我有一個Windows服務,可以在特定事件中重新啓動Windows,但我遇到問題。我不想在使用Windows安裝程序安裝程序時重新啓動Windows。如何找出Windows安裝程序是否忙或不使用delphi?
因此,我可以確定Windows安裝程序是否正在安裝某些東西。
任何Delphi或命令行函數都是可以接受的。
你能幫我嗎?
我發現了這兩個classess,但我不知道如何使用它們。
我有一個Windows服務,可以在特定事件中重新啓動Windows,但我遇到問題。我不想在使用Windows安裝程序安裝程序時重新啓動Windows。如何找出Windows安裝程序是否忙或不使用delphi?
因此,我可以確定Windows安裝程序是否正在安裝某些東西。
任何Delphi或命令行函數都是可以接受的。
你能幫我嗎?
我發現了這兩個classess,但我不知道如何使用它們。
基於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;
我只是猜測這裏因爲你沒有提供足夠的信息...
1)如果你想重新啓動只有當特定的安裝程序沒有運行,您應該枚舉正在運行的進程的窗口,如果你發現安裝程序你想知道只是不要重新啓動你的系統。
2)如果您希望更廣義的解決方案,你仍然有一個選擇:該類型的.msi安裝使用msiexec.exe的。如果您希望知道這種類型的安裝程序,則可以搜索正在運行的進程的列表。
資源:
Windows安裝程序提供了一個mutex告訴你,如果安裝過程。我會在SCManager API調用中使用它,因爲它是線程安全的。希斯·斯圖爾特(MSFT MSI專家)寫了關於它的文章here,他的建議應該給予Windows Installer團隊更高的可信度。
那麼,你有沒有嘗試過這種技術?我可以看到由msiexec.exe進程創建的唯一互斥量是Process Explorer中的\ Sessions \ 1 \ BaseNamedObjects \ MSCTF.Asm.MutexDefault1。所以即使它可能更可信,它仍然是8年前的文章,而且從那時起許多文章可能會發生變化。 MSI的文檔是災難性的。 [Windows 7 SP1] – TLama
我已經做了17年的安裝程序和11年的Windows安裝程序。無論好壞,MSI在幾年內都沒有改變。他們在這裏和那裏增加了一點點,但他們非常非常注重向後兼容性,並且變化緩慢。互斥體是有效的,並且在MSI處於執行序列時被創建。 UI序列不會創建互斥鎖,因爲客戶端不會執行安裝。 –
+1這感覺就像是正確的解決方案 –
雖然文章已經過時,但它仍然是我說的最可靠的來源。它由Windows Installer團隊編寫。 – TLama
這一個爲我工作,你非常坦克 – Zeid
在這篇文章的評論是希思斯圖爾特的寶石,說繼續使用互斥體。希斯知道他的東西。 –