VC常用代码之实现卸载指定软件
来源:互联网 发布:软件开发费 税率2017 编辑:程序博客网 时间:2024/05/22 02:16
作者:朱金灿
来源: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 lineNULL, // Process handle not inheritableNULL, // Thread handle not inheritableFALSE, // Set handle inheritance to FALSE0, // No creation flagsNULL, // Use parent's environment blockNULL, // 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文件。
阅读全文
0 0
- VC常用代码之实现卸载指定软件
- 代码实现安装、卸载、分享软件
- VC常用功能--代码实现
- android 软件卸载 代码
- MFC软件卸载代码
- 软件的分享、卸载、详细信息、运行的代码实现
- VC常用代码之动态加载DLL
- VC常用代码之创建进程
- android 代码卸载指定APK小结
- Android研究之监听自身应用被卸载代码实现
- Ubuntu下实现软件卸载
- vc常用代码
- VC常用代码
- VC常用代码段
- vc常用代码总结
- VC常用代码
- VC常用代码
- VC常用代码
- redis命令
- vue与leaflet的结合使用,在popup上放置一个按钮,点击后使用amout挂载一个未挂载的实例,显示一些信息
- HDU 1023(卡特兰数打表)
- 换源
- android recovery 模块知识需求汇总
- VC常用代码之实现卸载指定软件
- 联想拯救者R720安装Win7系统
- json操作
- vim 常用快捷键及使用技巧
- 《算法》——第二章:排序
- c语言3种链接属性: 外部(external), 内部(internal),无设置(none)
- 购物车 结算功能,选中勾选状态可以显示所有选中的总价还有选中的数量,未选中不进行计算,删除功能
- 隐马尔科夫模型(HMM)
- Ajax