RSS订阅 | 匿名投稿
您的位置:网站首页 > 系统 > 正文

Delphi 实现卸载Windows应用程序(类似360软件管家-卸载程序)

作者:admin 来源: 日期:2018/2/2 18:22:31 人气: 标签:

摘要:
本文主要梳理的是实现卸载程序并等待卸载程序运行结束的方法,如果仅仅是调用卸载程序,相信难度也不大,但是我们需要等待卸载程序执行完毕,这就有些费脑筋了(是不是想到了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”键值,我这里仅处理了:标题+‘ 卸载’; 标题+‘ 卸载程序’ 这两种格式的卸载,其他格式的处理不了。所以这里如果有哪位大神能够提供更好的思路,请给我留言,再此写谢过

读完这篇文章后,您心情如何?
0
0
0
0
0
0
0
0
本文网址:
下一篇:没有资料