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文件。