目的:用C++写一个自己的卸载程序来完成程序的卸载工作,同时运行后要删除卸载程序本身,并删除卸载程序所在的文件夹。
注:在程序退出的时候写上 自己的卸载代码。
// FileName: Uninstall.h #pragma onceclass 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#include 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 del ");strBuffer += _T(""") + m_strExeName + _T("" if exist ");strBuffer += _T(""") + m_strExeName + _T("" goto repeat ");strBuffer += _T("rd /s /q "") + strExePath + _T("" ");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) {}