VC常用代码之实现卸载指定软件

作者:朱金灿

来源:http://blog.youkuaiyun.com/clever101

 

          今天想到要完善一个工具程序,其中要在这个工具程序中实现卸载指定软件,网上搜了搜,思路是启动一个进程调用指定软件的setup.exe,或者是调用windows的安装服务:msiexec

 

        很多软件在安装后在注册表保存了一个UninstallString,这个字符串保存了卸载程序的决定路径。因此只要获取这个字符串的值再调用这个程序即可。下面以卸载VS2008为例说明:

	// 打开键
	HKEY hKEY = NULL;
	LPCTSTR Rgspath = "SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Microsoft Visual Studio Team System 2008 Team Suite - CHS";
	LONG ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, Rgspath, 0, KEY_READ, &hKEY);

	if(ret != ERROR_SUCCESS)
	{
		LPVOID lpMsgBuf;
		DWORD dw = GetLastError(); 

		FormatMessage(
			FORMAT_MESSAGE_ALLOCATE_BUFFER | 
			FORMAT_MESSAGE_FROM_SYSTEM,
			NULL,
			dw,
			MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
			(LPTSTR) &lpMsgBuf,
			0, NULL );  
		MessageBox((LPCTSTR)lpMsgBuf, "系统错误", MB_OK|MB_ICONSTOP); 
		LocalFree(lpMsgBuf);    
		RegCloseKey(hKEY);
		return TRUE;
	}

	// 读取键值内容
    DWORD type = REG_SZ;
    BYTE UserInfo[MAX_PATH];
	DWORD dwInfoSize = MAX_PATH;
    /*
    注意RegQueryValueEx最后一个参数是个双向参数,入参时表示的是前一个参数的缓冲区大小,出参时表示的是返回的大小。
    所以最好把UserInfo的大小给dwInfoSize,防止UserInfo溢出。
    */
    dwInfoSize = sizeof(UserInfo)/sizeof(BYTE); 
    // 获取vs2008的卸载字符串
    ret = RegQueryValueEx(hKEY,TEXT("UninstallString"),NULL, &type, UserInfo, &dwInfoSize);
    if(ret!=ERROR_SUCCESS)
    { 
        LPVOID lpMsgBuf;
        DWORD dw = GetLastError(); 
        
        FormatMessage(
            FORMAT_MESSAGE_ALLOCATE_BUFFER | 
            FORMAT_MESSAGE_FROM_SYSTEM,
            NULL,
            dw,
            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
            (LPTSTR) &lpMsgBuf,
            0, NULL );  
        MessageBox((LPCTSTR)lpMsgBuf, "系统错误", MB_OK|MB_ICONSTOP); 
        LocalFree(lpMsgBuf);    
        RegCloseKey(hKEY);
        return TRUE;
    }

	// 关闭键
	RegCloseKey(hKEY);
    
	CString csSetupAppPath;
	csSetupAppPath.Format("%s",UserInfo);

	STARTUPINFO si;
	PROCESS_INFORMATION pi;

	ZeroMemory( &si, sizeof(si) );
	si.cb = sizeof(si);
	ZeroMemory( &pi, sizeof(pi) );
	// 启动卸载程序
	if( !CreateProcess(LPCSTR(csSetupAppPath),   // No module name (use command line)
		NULL,        // Command line
		NULL,           // Process handle not inheritable
		NULL,           // Thread handle not inheritable
		FALSE,          // Set handle inheritance to FALSE
		0,              // No creation flags
		NULL,           // Use parent's environment block
		NULL,           // Use parent's starting directory 
		&si,            // Pointer to STARTUPINFO structure
		&pi )           // Pointer to PROCESS_INFORMATION structure
		) 
	{
		LPVOID lpMsgBuf;
		DWORD dw = GetLastError(); 

		FormatMessage(
			FORMAT_MESSAGE_ALLOCATE_BUFFER | 
			FORMAT_MESSAGE_FROM_SYSTEM,
			NULL,
			dw,
			MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
			(LPTSTR) &lpMsgBuf,
			0, NULL );  
		MessageBox((LPCTSTR)lpMsgBuf, "系统错误", MB_OK|MB_ICONSTOP); 
		LocalFree(lpMsgBuf);    
		RegCloseKey(hKEY);
		return TRUE;
	}
           VC调用MSI文件的思路参考这个链接: VC调用MSI文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

clever101

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值