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文件。
来源: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文件。
相关文章推荐
- android 代码实现软件的静默安装,卸载功能(转载)
- 转: VC实现指定文件拷贝到U盘的代码
- 代码实现安装、卸载、分享软件
- 在Android程序代码中实现软件安装和卸载
- 在Android程序代码中实现软件安装和卸载
- VC常用功能--代码实现
- 在Android程序代码中实现软件安装和卸载
- 软件的分享、卸载、详细信息、运行的代码实现
- 用VC++实现软件的多语种支持
- 用自删除dll实现应用程序的安装/卸载代码
- 简单SNMP管理程序的VC++代码实例实现
- 在DataGrid中实现鼠标指定列特殊显示的代码(VB.NET 2003)
- 用VC++实现软件的版本在线升级
- 用自删除dll实现应用程序的安装/卸载代码
- 在VC中怎样实现软件的注册机制
- 用自删除dll实现应用程序的安装/卸载代码
- 用自删除dll实现应用程序的安装/卸载代码
- 几块VC中的常用代码
- 软件开发中几个常用功能的实现
- 软件开发中几个常用功能的实现