-
-
[求助]用NSIS制作的安装包里面的uninst.exe,用CreateProcess(x,..\uninst.exe,...如何判断是否进程结束?
-
发表于:
2012-12-9 20:43
6085
-
[求助]用NSIS制作的安装包里面的uninst.exe,用CreateProcess(x,..\uninst.exe,...如何判断是否进程结束?
用NSIS向导制作了一个安装包(无任何文件)setup.exe,安装完毕会在安装位置产生一个uninst.exe(执行卸载功能的),用CreateProcess创建了这个卸载进程,
if(!CreateProcess(NULL,(LPTSTR)(LPCTSTR)m_exefilePath/*path*/,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi))
{
MessageBox(_T("创建进程失败!"));
return;
}
else
{
DWORD nID=GetProcessId(pi.hProcess);
WaitForSingleObject(pi.hProcess,INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
发现得到的进程ID(PID)跟任务管理器中的不同,就其原因是这样的:执行uninst.exe,会产生uninst.exe进程(进程名就是uninst.exe),然而马上uninst.exe就不见了进而变成了一个叫Au_.exe的新进程,该进程才是真正实现卸载功能的。
现在情况如下:
我想等待卸载进程结束,结束之后我查看注册表或者文件(uninst.exe文件)来判断用户是真正执行了卸载操作还是中途取消卸载了,现在由于是等待的pi.hProcess-----uninst.exe,并非真正的卸载进程Au_.exe,所以是无法实现的。
耍了个小聪明:
当进程创建之后,首先调用GetProcessidFromName(_T("Au_.exe"))来得到进程ID,如果ID不为0说明uninst.exe结束后产生的Au_.exe进程存在,然后根据PID得到HANDLE,再调用WaitForSingleObject(HANDLE,X)来实现。
以上的办法不够理想,不晓得大侠们有什么好的思路没有。(ps:卸载程序不是自己编写的,完全不受自己控制的),上传了一个用nsis制作的最简单的安装包,方便大家交流。三克油先!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)