C++ 卸载程序
目的:用C++写一个自己的卸载程序来完成程序的卸载工作,同时运行后要删除卸载程序本身,并删除卸载程序所在的文件夹。
注:在程序退出的时候写上 自己的卸载代码。
// FileName: Uninstall.h #pragma once class CUninstall { private: // Exe文件名 CString m_strExeName; // Bat文件名 CString m_strBatName; public: // exe的路径 CString m_strExePath; // bat的路径 CString m_strBatPath; CString m_unInstallPath; public: // 是否已经复制到临时文件夹 bool GetState (void); // 初始化 void Init (void); // 卸载程序 void Uninstall (void); public: CUninstall(); ~CUninstall(); };
// FileName: Uninstall.cpp #include "stdafx.h" #include "Uninstall.h" #include <atlconv.h> #include <locale.h> CUninstall::CUninstall() : m_strExeName(_T("XABC01.exe")), m_strBatName(_T("XABC01.bat")) { TCHAR strPath[MAX_PATH] = {0}; GetTempPath(MAX_PATH, strPath); m_strExePath = strPath; m_strExePath += m_strExeName; memset(strPath, 0, MAX_PATH); GetTempPath(MAX_PATH, strPath); m_strBatPath = strPath; m_strBatPath += m_strBatName; } CUninstall::~CUninstall() { } void CUninstall::Uninstall (void) { // 获取exe所在路径 CString strExePath; // 临时问价下exe文件所在路径 HMODULE hModule = NULL; TCHAR strPath[MAX_PATH] = {0}; HKEY hKey; ::GetModuleFileName(hModule, strPath, MAX_PATH); strExePath = strPath; // 拷贝到临时文件夹 CopyFile(strExePath, m_strExePath, FALSE); int nIndex = strExePath.ReverseFind(_T('\\')); strExePath = strExePath.Left(nIndex); m_unInstallPath = strExePath; HANDLE hande = CreateFile (m_strBatPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, NULL); CloseHandle(hande); // 写卸载批处理文件文件到磁盘 CString strBuffer; strBuffer = _T(":repeat\ndel "); strBuffer += _T("\"") + m_strExeName + _T("\"\nif exist "); strBuffer += _T("\"") + m_strExeName + _T("\" goto repeat\n"); strBuffer += _T("rd /s /q \"") + strExePath + _T("\"\n"); strBuffer += _T("del \"") + m_strBatName + _T("\""); CStdioFile file; if (file.Open(m_strBatPath, CFile::modeWrite)) { char* old_locale=_strdup(setlocale(LC_CTYPE,NULL) ); setlocale( LC_CTYPE,"chs"); file.WriteString(strBuffer); file.Close(); setlocale( LC_CTYPE, old_locale ); //还原语言区域的设置 free( old_locale );//还原区域设定 } else { ::MessageBox (NULL, TEXT("文件写入磁盘失败!"), TEXT(""), MB_OK|MB_ICONEXCLAMATION); } } bool CUninstall::GetState (void) { if (PathFileExists(m_strBatPath)) { return true; } else { return false; } } void CUninstall::Init (void) { }