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)
{

}

(0)

相关推荐

  • VC++实现通过API来查看程序错误信息的方法

    本文实例介绍了VC++通过API查看错误信息的方法,可以在遇到错误的时候,将显示出错信息并退出处理,具体的实现代码如下: if((m_hBitMap=(HBITMAP)::LoadImage(NULL,filepath,IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE))==NULL) { LPVOID lpMsgBuf; DWORD dw = ::GetLastError(); FormatMessage( FORMAT_MESSAGE_ALLOC

  • C++获取本机登陆过的QQ号码示例程序

    先看效果图,代码在下面 复制代码 代码如下: // FileName: GetQQ.h #pragma once #include <vector> class GetQQ{private:    std::vector<CString> m_qqNum; public:    GetQQ();    ~GetQQ();public: // 获取QQ号码    std::vector<CString> Init(void);}; 复制代码 代码如下: // FileNa

  • Microsoft Visual C++ 程序的部署方法

    1. 用Microsoft Visual C++ 6.0编译的程序,或者发布在Windows 2000/NT/ME/98 系统单纯通过拷贝MSVCRxx.DLL文件到应用程序目录或system32目录即可 2. 用Visual Studio 2005以上编译的程序,且发布在Windows XP及以上系统为了减少DLL引发的配置问题(DLL hell),C和C++运行时由并行 (Side-by-Side) 程序集实现,单纯通过拷贝MSVCRxx.DLL并不足以在非开发环境正常运行程序,必须通过一个

  • C++非递归遍历磁盘文件和递归遍历磁盘文件的程序示例

    1:非递归方法: 复制代码 代码如下: // File Name: CSearch.h #pragma once#include <vector>#include <atlstr.h>#include <stack> class Search{private:    std::vector<CString> m_strPath;        // 保存查找到了文件路径    std::vector<CString> m_strSearchNam

  • 基于Windows C++ 应用程序通用日志组件的使用详解

    引言 在如何记录程序日志方面,通常有三种选择: 1.采用Log4CXX等公共开源日志组件:这类日志组件的特点是跨平台且功能比较强大,例如可以把日志发往另一台服务器或记录到数据库中等:另外,可配置性较高,可以通过配置文件或程序代码对日志进行很多个性化设置.但从另外一个角度看,由于这些优点往往也导致了在使用方面的缺点.首先,对于一般应用程序来说,它们并不需要太多的功能,通常只需要把日志记录到文件或反馈到应用程序,功能太多反正让用户使用起来觉得繁琐还得背负很多从来都用不到的代码.其次,这类日志组件通常

  • C++ 学习之旅 Windows程序内部运行原理

    学习C++与.net不同的是,一定要搞清楚Windows程序内部运行原理,因为他所涉及大多数是操作系统的调用,而.net毕竟是在.netFrameWork上唱戏. 那Windows应用程序,操作系统,计算机硬件之间的相互关系究竟什么了,下面的图就给予很好的解释. 向下箭头①是 应用程序运行判断处理的结果,输出到输出的设备. 向上箭头②是输入设备,输入到操作系统中. 向下箭头③代表API,我们要解释以下API是什么.API是应用程序接口, 表示应用程序可以通知操作系统执行某个具体的动作,如操作系统

  • VC++基于Dx实现的截图程序示例代码

    本文所述的程序示例为VC++图象特效的截图示例,需要DirectX 3.0以上版,代码中的GetScreen函数是本截图程序的关键.运行这个程序可用Esc键结束.代码中需要ddutil.h与ddutil.cpp文件,请自行下载添加.关于InitDDraw()函数,功能是初始化DirectDraw环境,创建换页链(主页面,一个后台缓冲区),以及创建一个定时器. 具体的功能代码如下: #include <windows.h> #include <windowsx.h> #include

  • 用C++实现队列的程序代码

    C++实现队列,如有不足之处,还望指正 复制代码 代码如下: // MyQueue.cpp : 定义控制台应用程序的入口点.//实现链式队列(queue),包括一个头结点.队列操作包括在队头出队(pop).在队尾入队(push).//取得队头元素(front_element).取得队尾元素(back_element).队列元素个数(size).//队列是否为空(empty).#include "stdafx.h"#include <iostream>using namesp

  • C++实现查壳程序代码实例

    本文实例讲述了C++实现查壳程序代码,分享给大家供大家参考.具体方法分析如下: 一般来说,PEID是基于特征码的,用python只需要两行代码,用VC实现用了这么多代码--. python中只要引入pefile模块,第一句代码指定数据库文件,第二句代码返回结果.具体的看pefile官方介绍吧 下面是C++的代码: 复制代码 代码如下: void CMyPeidDlg::OnBnClickedBtnOpen()  {      // 获取当前工作路径      CString strAppName

  • C++实现闹钟程序的方法

    本文所述为C++实现闹钟程序的方法,代码结构相对简单,注释也较为完善.现分享给大家供大家参考. 具体功能代码如下: #include<iostream> #include<string> #include<ctime> using namespace std; //时间类 class Time{ private: int hour; int minute; int second; public: //设置时间 void set(int h,int m,int s){ h

  • VC++实现程序开机启动运行的方法

    本文所述实例主要介绍如何在VC++下让程序开机自动运行的方法.一般而言添加到开机启动项,这是很多程序都有的做法,具体实现思路是利用win.in文件实现相关程序的开机自动启动.主要是通过WritePrivateProfileString函数来实现.下面来看这一功能的实现方法. 主要功能代码如下: HCURSOR CAutoRunDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CAutoRunDlg::OnBrowse() { //

随机推荐