Delphi 實現解除安裝Windows應用程式(類似360軟體管家-解除安裝程式)
摘要:
本文主要梳理的是實現解除安裝程式並等待解除安裝程式執行結束的方法,如果僅僅是呼叫解除安裝程式,相信難度也不大,但是我們需要等待解除安裝程式執行完畢,這就有些費腦筋了(是不是想到了360?沒錯,360也具有這個功能)。這套邏輯是最近專案需要自己研究出來的,可能存在不完善的地方,如果有路過的朋友可以指正,不勝感激!
正文:
很多人都知道獲取應用程式的解除安裝命令很簡單,都記錄在登錄檔中,在win64系統下,這個登錄檔地址為:
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
在32位系統下位置為:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
如果需要知道某個exe的具體解除安裝命令,就需要知道下一級的登錄檔節點名稱,比如Sogou Input,找到它的節點後就可以看到 鍵為 “UninstallString”的具體鍵值“C:\Program Files\SogouInput\Uninstall.exe”,這個就需要執行的解除安裝命令。
找到解除安裝命令後,開始執行吧,以下貢獻一份Delphi執行程序並等待結束的函式:
執行解除安裝的命令:function RunProcess(FileName: string; ShowCmd: DWORD; bWait: Boolean; ProcID: PDWORD): Longword; var StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; begin FillChar(StartupInfo, SizeOf(StartupInfo), #0); StartupInfo.cb := SizeOf(StartupInfo); StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK; StartupInfo.wShowWindow := ShowCmd; if not CreateProcess(nil,@Filename[1], nil, nil, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo,ProcessInfo) then Result := WAIT_FAILED else begin if bWait = FALSE then begin if ProcID <> nil then ProcID^ := ProcessInfo.dwProcessId; result := WAIT_FAILED; exit; end; WaitForSingleObject(ProcessInfo.hProcess, INFINITE); GetExitCodeProcess(ProcessInfo.hProcess, Result); end; if ProcessInfo.hProcess <> 0 then CloseHandle(ProcessInfo.hProcess); if ProcessInfo.hThread <> 0 then CloseHandle(ProcessInfo.hThread); end;
unInstallStr//真正的解除安裝命令;aProgressID: PDWORD;返回程序ID
//執行解除安裝
RunProcess(unInstallStr, SW_SHOW, True, aProgressID);
預期執行到這裡應該就結束了,因為上面已經是在執行解除安裝並且等待結束了吧?可是Uninstall.exe僅僅是完成了呼叫具體應用程式的解除安裝功能,真實的解除安裝才剛剛開始。
於是有了上一個博文的內容,我的思路是根據解除安裝窗體的標題,找到程序PID並等待它結束。 詳細實現參考上一篇博文,這裡不再述了。
目前這裡邏輯有問題的是: 解除安裝窗體的標題並不統一,應該是不同的安裝包製作出來的標題不盡相同。標題的來源是解除安裝登錄檔中的“DisplayName”鍵值,我這裡僅處理了:標題+‘ 解除安裝’; 標題+‘ 解除安裝程式’ 這兩種格式的解除安裝,其他格式的處理不了。所以這裡如果有哪位大神能夠提供更好的思路,請給我留言,再此寫謝過