zoukankan      html  css  js  c++  java
  • 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)
    {
    
    }
  • 相关阅读:
    形象的理解Strong和Weak
    iOS开发中常见的一些异常
    离屏渲染
    如何从海量IP中提取访问最多的10个IP
    XJOI3363 树3/Codeforces 682C Alyona and the Tree(dfs)
    XJOI 3578 排列交换/AtCoder beginner contest 097D equal (并查集)
    XJOI 3605 考完吃糖(DAG图dfs)
    POJ 3660 Cow Contest(传递闭包)
    XJOI 3601 技能(贪心+二分)
    51nod 1421 最大MOD值(高妙的调和级数复杂度)
  • 原文地址:https://www.cnblogs.com/calm2012/p/3110474.html
Copyright © 2011-2022 走看看