delphi 实现卸载Windows应用程序(类似360软件管家-卸载程序)  
官方Delphi 学习QQ群: 682628230(三千人)
频道

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;

推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号

执行时间: 0.054440975189209 seconds