您的位置:首页 > 编程语言

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

2017-11-21 19:21 423 查看
作者:朱金灿

来源:http://blog.csdn.net/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文件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: