首页
社区
课程
招聘
[求助]用CreateProcess执行一个外部卸载程序,如何知道用户卸载成功了还是中途取消卸载了呢?
发表于: 2012-9-11 18:22 7910

[求助]用CreateProcess执行一个外部卸载程序,如何知道用户卸载成功了还是中途取消卸载了呢?

2012-9-11 18:22
7910
用CreateProcess执行一个外部卸载程序,如何知道用户卸载成功了还是中途取消卸载了呢?比如类似这样:CreateProcess(NULL,_T(QQ的卸载.exe),.....)后弹出卸载对话框询问是否卸载。。。。。可以点击否或者取消(没有卸载)也可以点击是(进行卸载),现在的问题是,我如何知道是卸载了还是没有卸载掉?(用户点击了取消情况)

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 209
活跃值: (143)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
GetExitCodeProcess
2012-9-11 18:53
0
雪    币: 128
活跃值: (27)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
目标程序的Main函数的返回值就是程序的ExitCode可以用GetExitCodeProcess获取
2012-9-11 22:23
0
雪    币: 142
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
标准卸载程序还好说,返回值应该还有规律.
要是作者自己做的卸载程序,而且那作者根本没注意卸载程序的exitcode,成功与否都返回同一个值,比如我有时候就这样....
也许可以从安装时的注册表,以及安装路径做参考.卸载成功与否可以通过检查注册表或者是安装目录有没有变化来判断.
2012-9-12 00:50
0
雪    币: 132
活跃值: (214)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
5
正如楼上所说那样,很多卸载程序的exitcode返回值很奇葩,从返回值可能判断一些,但很多都不适用的,曾几何时也想过检测卸载程序是否还存在来看是否卸载。。。。然而有些卸载参数或命令并非单纯的c:\program....\unstall.exe类似这样,而是比较蛋疼的MsiExec.exe /X{052CFB79------}
所以想不到什么好的方法,但是OS自带的添加或删除程序,360的软件管家等这些软件是如何实现的呢?求指导。。。
2012-9-12 09:43
0
雪    币: 209
活跃值: (143)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
OS添加删除程序时也没有万能的办法,不确定的靠用户决定。win7上很常见的两个界面,一个让你选择“程序是否正常安装”,一个让你选择“程序是否完成卸载”
2012-9-12 11:01
0
雪    币: 132
活跃值: (214)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
7
我的是XP SP3,确实不太好实现,想到一个办法来实现:通过判断注册表项是否还存在来决定是否已经卸载掉了.

void CSoftXiezaiInfoDialog::OnBnClickedButtonUnstall()
{
	// TODO: 在此添加控件通知处理程序代码
	CString m_exefilePath=m_unstallString;
	//创建卸载进程
	if(!CreateProcess(NULL,(LPTSTR)(LPCTSTR)m_exefilePath,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi))
	{
		MessageBox(_T("创建进程失败!"));
		return;
	}
	else
	{
		WaitForSingleObject(pi.hProcess,INFINITE);
		GetExitCodeProcess(pi.hProcess,&dwExitCode);
		CloseHandle(pi.hProcess);
		CloseHandle(pi.hThread);
		//判断此软件名在注册表中的项还存在否
		//需要根据软件名找到他的注册表对应的项
		GetDlgItemText(IDC_XIEZAI_NAME,m_softName);
		map<CString,CString>::iterator iter_map=CSoftXiezaiTypeListDialog::m_softnameregeditmap.find(m_softName);
		if(iter_map!=CSoftXiezaiTypeListDialog::m_softnameregeditmap.end())
		{
			m_regeditString=(*iter_map).second;
		}
		CString m_regeditStringTemp=_T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\")+m_regeditString;
		HKEY hKey;
		if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,m_regeditStringTemp,NULL,KEY_ALL_ACCESS,&hKey)==ERROR_SUCCESS)
		{
			//此项还在表明没有执行卸载可能是点击的取消等,不需要做任何改变
		}
		else
		{
			//此项已经不在表明执行了卸载了,需要刷新子控件
			m_UnstallButton.SetText(_T("已卸载"),RGB(51,51,51));
			m_UnstallButton.Invalidate();
		}
	}
}

不晓得还有没有其他方式,也不晓得360,QQ等那些软件管家是如何实现此处的。。。
2012-9-12 14:35
0
雪    币: 142
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
差不多就行了,没谁能做到十全十美,微软自己的也是这样.
至于36X这种,都是做表面文章蒙小白的,该卸不掉的还是卸不掉.它自己都没能力把自己卸干净,还指望它能把别人卸干净?
2012-9-12 16:30
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
通过注册表来实现的,具体可以买本注册表手册。
2012-9-12 21:20
0
雪    币: 132
活跃值: (214)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
10
强,万能答案!
2012-9-12 23:41
0
雪    币: 122
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
36* 类似的 判断 方案  起码有 3套 判断原则 来进行 最后的判决,也就是  没有一种 就能判定的 方式的,不同 软件 真的 很奇8
2012-9-20 12:15
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
12
这个完全是个不是问题的问题。。。。。比如,什么叫安装了什么叫没安装?

一个程序可以写N多注册表也可以任何注册表不写

他的位置可以在磁盘任何一个文件夹里面

简而言之,所谓一个程序是不是安装了,没有任何判断标准

比如,某些程序,可能就只需要把他的exe放到一个找的都的地方,这就叫安装了。。。有的可能还需要再注册几个ocx什么的。。。

这个与日常的你从u盘copy个文件到你电脑没什么区别

你如果要觉得,“36X那些都做到了,那肯定是有一个确定的标准判断一个程序是不是安装了”

我只能说,你也是小白
2012-9-20 13:20
0
雪    币: 132
活跃值: (214)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
13
听君一席话,胜读十年书
2012-9-20 23:03
0
雪    币: 122
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
36x啊  什么 之所以 在 注册表里 或 服务引导 表 中有 它的 痕迹,不是用来 确定 “我在系统中已安装” 这个意思的,它 可能  有其他用途,比如  自启动,防卸载 等其他功能, 每套 软件 都有 自己 判断 “软硬件 是否卸载” 的标准,要不然 它 怎么对用户说,说“我不知道……”,这跟 小白 和 老白有啥关系,只是 软件对用户 体验的一个保障而已。
2012-9-21 10:39
0
游客
登录 | 注册 方可回帖
返回
//