本文整理自网络,侵删。
摘要:本文主要梳理的是实现卸载程序并等待卸载程序运行结束的方法,如果仅仅是调用卸载程序,相信难度也不大,但是我们需要等待卸载程序执行完毕,这就有些费脑筋了(是不是想到了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;
相关阅读 >>
Delphi dbnavigator1 删除时弹出确认对话框
Delphi中combobox.items.indexof用法
更多相关阅读请进入《Delphi》频道 >>