首页 > C++ 卸载程序

C++ 卸载程序

目的:用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)
{}

 

 

转载于:https://www.cnblogs.com/calm2012/archive/2013/05/31/3110474.html

更多相关:

  • 因为函数参数是按值传递的,所以要想改变变量,必须传递地址。 二级指针实际上就是指针变量的地址,如果传递二级指针,函数声明必须写**。 (void**)&必须是本质上就是指针变量的地址才可以做这样的转换,并不是说把一个一级指针也可以转换,void**的本质是标识一个二级指针。 &data就是(默认数据类型 **)&data,(void...

  • 文章目录1. 解决问题2. 应用场景3. 实现如下:C++实现C语言实现4. 缺点 1. 解决问题 在工厂方法模式中,我们卖衣服。此时我们为每一种衣服创建不同的工厂,帽子有一个工厂专门创建,裤子有一个工厂专门创建,T恤有一个工厂专门创建。这样的方式保证了代码设计的开闭原则(对扩展开发,对修改关闭),解决了简单工厂模式中暴露的...

  • 转载于:http://blog.csdn.net/u012819339/article/details/50654764   实体作品请参看优酷视频。 若以上链接点击无效请把该链接地址复制到浏览器地址栏 http://v.youku.com/v_show/id_XODYzODczNzQ4.html 说明: 该作品为arvik于2014...

  • - (void)viewDidLoad {[super viewDidLoad];NSLog(@"我在玩手机");NSLog(@"手机没电了");[self chargeMyIphone:^{NSLog(@"出门逛街");}];NSLog(@"我在看电视"); }-(void)chargeMyIphone:(void(^)(void...

  • http://stackoverflow.com/questions/150446/how-do-i-detect-when-someone-shakes-an-iphone 我的实现(基于Eran Talmor): 没必要application.applicationSupportsShakeToEdit = YES; Set th...