【项目小技巧】【C++】实现自毁卸载

一、核心思想

在程序运行结束前,创建一个删除脚本,删除程序本身,最后在删除脚本自己。

二、代码实现

2.1 源代码

#include <windows.h>

void CreateAndRunSelfDeleteDirScript(const std::wstring& dirPath) {
  // 构造bat脚本路径
  std::wstring batPath = dirPath + L"\\_deldir.bat";
  FILE* fp = _wfopen(batPath.c_str(), L"w, ccs=UTF-8");
  if (fp) {
    fwprintf(fp, L"@echo off\n");
    // 延迟2秒左右
    fwprintf(fp, L"timeout /t 2 /nobreak >nul\n"); 
    // 跳转到临时目录,避免锁定目标目录
    fwprintf(fp, L"cd /d %%TEMP%%\n");
    // 递归删除目标目录
    fwprintf(fp, L"rd /s /q \"%%~1\"\n");
    // 删除自身脚本
    fwprintf(fp, L"del \"%%~f0\" >nul 2>nul\n");
    fclose(fp);
    
    // 包围参数,避免路径中存在空格导致删除失败
    std::wstring params = L"\"" + dirPath + L"\"";
    // 启动bat脚本
    ShellExecuteW(NULL, L"open", batPath.c_str(), params.c_str(), NULL, SW_HIDE);
  }
}

2.2 调用方式

#include <string>

int main(void) {
  std::wstring path = L"D:\yyh"; // 要删除的目录(自毁卸载的话,就是卸载器所在的目录)
  
  CreateAndRunSelfDeleteDirScript(path);
  
  return 0;
}

三、补充

  1. 支持中文路径、英文路径、中英混合路径
  2. 支持路径中带有 %
  3. 支持路径中带有 空格
  4. 在高权限目录需要管理员权限,所以可能会失败
  5. 如果没有数字签名,可能会被部分杀毒软件视为危险
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值