VC 如何使程序运行后自己删除自己

2023-11-08


VC 如何使程序运行后自己删除自己

有时候,我们需要创建一个运行后能够自己删除自己的可执行程序即自删除程序。很明显如果一个进程通过直接调用DeleteFile()来删除自己是不可能的。必须另想办法,经过本人在网上参考很多资料后实际测试并集众家之所长,发现有二种方法效果比较好。现在将其封装成函数,这样使用将更加容易:

 

方法1,调用BAT文件。

//向指定文件写入文本。如果文件不存在就创建。

int WriteTextToFile(const char szFileName[], const char *lpszText)

{

       FILE *pfile = fopen(szFileName"w+");

       if (pfile == NULL)

              return -1;

       int nWriteByte = fprintf(pfilelpszText);

       fclose(pfile);

       return nWriteByte;

}

void DeleteApplicationSelf() 

{

       const char szFileName[] = "DeleteBat.bat"//使用批处理

       const char szDeleteBatText[] = "@ echo off\r\ndel %%1\r\ndel %%0";

 

       //创建BAT文件并写入内容

       WriteTextToFile(szFileNameszDeleteBatText);

 

       //设置本程序进程基本为实时执行,快速退出。

       SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);

       SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);

       //通知资源管理器不显示本程序,当然如果程序没有真正的删除,刷新资源管理器后仍会显示出来的。

    SHChangeNotify(SHCNE_DELETESHCNF_PATH_pgmptrNULL);

      

       //运行bat文件来删除程序

       ShellExecute(NULL"open""DeleteBat.bat"_pgmptrNULLSW_HIDE);

 

       ExitProcess(0);

}

调用起来非常方便:直接一个DeleteApplicationSelf()就完成了任务。

 

方法二。调用系统的cmd程序并传入参数。

void DeleteApplicationSelf()

{

       char szCommandLine[MAX_PATH + 10];

 

       //设置本进程为实时执行,快速退出。

       SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);

       SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);

       //通知资源管理器不显示本程序,当然如果程序没有真正的删除,刷新资源管理器后仍会显示出来的。

    SHChangeNotify(SHCNE_DELETESHCNF_PATH_pgmptrNULL);

      

       //调用cmd传入参数以删除自己

       sprintf(szCommandLine"/c del /q %s"_pgmptr);

       ShellExecute(NULL"open""cmd.exe"szCommandLineNULLSW_HIDE);

 

       ExitProcess(0);

}

调用方法与前面相同。

 

这二种方法都不会出现DOS程序窗口,完全达到了无影无踪的删除效果,更加不会出现有的程序自删除后仍显示程序图标,要刷新资源管理器后才发现程序被删除了。

 

再对代码作下讲解:

1_pgmptr 的定义为extern char * _pgmptrstdlib.h文件对其说明为:points to the module (EXE)name。使用_pgmptr与使用GetModuleFileName(NULLszExePathMAX_PATH);来得到程序的路径是等效的。

2ShellExecute()最后一个参数为SW_HIDE表示隐藏窗口。

3DOS命令del/q参数表示安静模式,这样删除文件时就不会出现要求用户确认的提示对话框了。

 

附:二种方法都要加入头文件及lib

#include <windows.h>

#include <stdlib.h>

#include <shellapi.h>

#include <shlobj.h>

 

#pragma comment(lib, "shell32.lib")

转载请标明出处,原文地址:http://www.cnblogs.com/morewindows/archive/2011/08/12/2136342.html

分类:  Win32 api
5
(请您对文章做出评价)
« 博主前一篇: 白话经典算法系列之五 归并排序的实现
» 博主后一篇: 白话经典算法系列之六 快速排序 快速搞定


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VC 如何使程序运行后自己删除自己 的相关文章

  • 无法在 Windows 10 上更新 pip 的 PATH 变量

    我知道有数千个类似的主题 但我的 pip 命令突然停止工作 尽管我进行了所有研究 但我无法弄清楚原因 自从我上次使用 pip 以来已经有一段时间了 令人惊讶的是我的计算机不再识别该命令 我重新安装了pip 提示告诉我PATH变量没有正确更新
  • 无法在 JavaScript for 循环中读取 null 的属性“长度”

    我正在尝试制作一个像 Stack Overflow 那样的 Markdown 编辑器 如果我实际上没有在文本区域中键入星号和包含短语的 http 我会收到标题中列出的此错误 如果我只输入包含星号的短语 则错误指的是这一行 if linkif
  • 如何在VIM中设置文件的正确路径?

    每当我击中 pwd在 vim 中命令总是返回路径C Windows system32 即使我在桌面上的 Python 文件中 所以每当我跑步时 python 命令返回 python can t open file Users myname
  • 如何检查 BOOL 是否为空?

    有没有办法在将值分配给 BOOL 之前检查该值是否为 NULL Nil 例如 我在 NSDictionary 中有一个值可以是 TRUE FALSE NULL mySTUser current user following results
  • C++ new * char 不为空

    我有一个问题 我在 ASIO 中开发服务器 数据包采用尖头字符 当我创建新字符时 例如char buffer new char 128 我必须手动将其清理为空 By for int i 0 i lt 128 i buffer i 0x00
  • 将 null 转换为对象?

    我今天遇到了这段代码 AsyncInvoke OnTimeMessageTimer object null ElapsedEventArgs null 有没有什么问题 有时 当方法重载时 您需要这样做 以告诉编译器您正在调用哪一个 null
  • Java 环境变量设置正确,但 java 找不到 jar

    Summary Java 环境变量设置正确 从 echoing 可以看出 但是 仅当明确包含在 javac 命令中时才能看到 jar Details 这与图形和OpenGl没有具体关系 肯定问题与类路径有关 即第三方的导入jar files
  • WSDL PHP 函数返回 null,而其他函数返回预期结果

    Summary 在这里 我将列出我解决此问题所采取的所有步骤 以供其他人参考 1 PHP 很愚蠢地 监听 函数的输入消息来定义它应该使用哪个函数 因此 为每个函数提供不同的输入消息 即使它使用相同的类型或元素 您可能认为这对您来说是一项艰巨
  • 连接路径的函数?

    是否有现有的函数来连接路径 我知道实施起来并不困难 但仍然 除了照顾尾随 or 我需要注意正确的操作系统路径格式检测 即我们是否编写C dir file or dir file 正如我所说 我相信我知道如何实施它 问题是 我应该这样做吗 现
  • JOGL 异常 - 在 java.library.path 中找不到gluegen-rt

    线程 main java lang UnsatisfiedLinkError中出现异常 java library path中没有gluegen rt 在 java lang ClassLoader loadLibrary ClassLoad
  • Android Studio 使用的默认 Android SDK 路径是什么?

    使用Android Studio下载Android SDK时 默认下载路径是什么 我有兴趣了解 Linux Mac 和 Windows 的路径 在网上搜索了一下 好像是这样的 Linux Android Sdk Mac Library An
  • 可空类型:在 C# 中检查 null 或零的更好方法

    我正在开展一个项目 我发现我正在很多很多地方检查以下内容 if item Rate 0 item Rate null 更多的是出于好奇 检查这两种情况的最佳方法是什么 我添加了一个辅助方法 public static bool nz obj
  • MySQL - 使用可变路径加载数据文件

    我在设置用于将数据放入表中的变量路径时遇到问题 这就是我构建路径的方式 SET path1 CONCAT C Projekte Metrics DXL CSV EXPORT DATA YEAR NOW MONTH NOW DAY NOW B
  • python 打开相对文件夹中所有以.txt结尾的文件

    我需要打开并解析文件夹中的所有文件 但我必须使用相对路径 类似于 input files 我知道在 JavaScript 中你可以使用 path 库来解决这个问题 我怎样才能在Python中做到这一点 这样您就可以获得路径中的文件列表作为列
  • Magento 路由器 URL - 需要连字符的路径名称

    假设我使用自定义控制器 其 url 路径 前端名称为 customcategory 好吧 显然如果我有一个名为 TestController php 和indexAction的控制器文件 url 路径将是 customcategory te
  • golang中如何将相对路径解析为绝对路径?

    节点中是否有类似 path resolve 的API 或者有什么东西可以做同样的事情 例如 nodejs代码 path resolve sample sh 应该得到 home currentuser sample sh 解决 表示用户主目录
  • Cmake 错误:无效的转义序列 \U

    使用 CMake 在 VC 10 中运行 OpenCL 代码时 出现以下错误 CMake Error at CMakeLists txt 6 set Syntax error in cmake code at C Users Shreedh
  • 使用 jq 过滤空值和/或 null 值

    我有一个包含 jsonlines 的文件 想找到空值 name Color TV price 1200 available name DVD player price 200 color null 并希望输出空和 或空值及其键 availa
  • 过滤路径列表以仅包含文件

    如果我有一个清单FilePaths 如何过滤它们以仅返回常规文件 即不是符号链接或目录 例如 使用getDirectoryContents main do contents lt getDirectoryContents foo bar l
  • 节点未找到全局模块

    所以我意识到这是一个相当通用的标题和问题 但我已经搜索了很多答案 但遗憾的是它们似乎都不适合我 我希望通过我自己提供更多信息 也许有人有一个具体的答案 或者确切地知道将我重定向到哪个答案 我的问题 当我全局安装节点模块时 例如npm ins

随机推荐

  • 动态规划之二维0-1背包问题(思考分析、解决、算法模板)

    一 问题描述 二维费用的背包问题是指对于每件物品 具有两种不同的费用 选择这件物品必须同时付出这两种代价 对于每种代价都有一个可付出的最大值 背包容量 求选择物品可以得到最大的价值 设第i件物品所需的两种代价分别为v i 和u i 两种代价
  • SiT9102:1-220MHz任意频率差分晶振,LVPECL/LVDS/HSCL/CML

    1 SiT9102简介 SiT9102差分晶振是1 220MHz之间任意频点 抖动 lt 1ps 输出支持LVDS LVPECL CML HCSL的高性能差分振荡器 频率稳定度高达 10ppm SiT9102得到了以XiLinx 为代表的主
  • 数据预处理之缺失值

    目录 0 前言 1 缺失值的识别 1 1 每个数据的识别 isnull 1 2 每列 行是否包含缺失值 isnull any isnull all 1 3 缺失值的个数 isnull sum 1 4 检查所有的数据 data info 1
  • C++ 泛型编程(四) 类模板

    前文回顾 C 泛型编程 一 基本概念 C 泛型编程 二 函数模版 C 泛型编程 三 模版实参推断 类模版 定义 定义 类模版是用来生成类的蓝图的 类似函数模版的定义 类模板以关键字 template 开始 后跟尖括号包围的模版参数列表 用关
  • jQuery仿QQ空间图片查看特效(全屏,放大,缩小,旋转,镜像,鼠标滚轮缩放)...

    地址 http www tuicool com articles 2YRVr2a 可以通过nmp或bower来安装该图片查看器插件 npm install imageviewer bower install imageviewer 复制代码
  • 关于kafka——幂等性

    怎么保证幂等性 幂等性 通俗点说 就一个数据 或者一个请求 给你重复来多次 你得确保对应的数据是不会改变的 不能出错 从业务层面考虑 比如你拿个数据要写库 你先根据主键查一下 如果这数据都有了 你就别插入了 update 一下好吧 比如你是
  • 服务器系统盘预留空间,固态硬盘的系统盘需要预留多空间?固态硬盘适不适合分区...

    固态硬盘的对于电脑的提速显而易见 再加少价格降成了萝卜价 所以固态硬盘成为绝大多数人的标配 对于固态硬盘的使用人们也是众说一词 有的人认为固态硬盘不宜多分区 会影响速度 有的人认为固态硬盘和机械硬盘的使用一样 没什么区别 关于这条 我们额外
  • vue 全局过滤器 时间格式 转换

    vue 项目要求将时间戳转成规定的时间格式 可以借助 moment js 完成 现要确定自己的数据是时间戳 安装命令 npm install moment save main js import moment from moment 设置过
  • Oracle日期格式yyyymmdd格式化为yyyy-mm-dd

    问题 日期展示为20200828需要展示为2020 08 28 解决 select TO CHAR TO DATE 20200828 yyyyMMdd YYYY MM DD FKDAT from dual 结果展示 2020 08 28
  • Docker安装Nginx+FTP访问静态资源

    1 拉取Nginx镜像 docker pull nginx latest 2 创建挂载目录 mkdir p server nginx conf mkdir p server nginx log mkdir p server nginx ht
  • 安装Ubuntu的注意事项

    安装win10 Ubuntu elemengtory OS直接进入win10而不出现linnux引导的问题 1 进入BIOS 启动UEFI 关闭Security 2 分区时应该注意的事项 1 swap 2000MB 主分区引导 起始 2 E
  • Pandas 缺失号

    三种缺失符号及其对比 pandas 1 0之前 三种记号 pandas 1 0 np nan None np NaT 时间序列用 类型 float64 Nonetype pandas libs tslibs nattype NaTType
  • mybatis 拼接动态表名、字段名

    转载地址 https blog csdn net xiaoxiangzi520 article details 76719098 今天在项目中遇到个需求是要动态的根据前台传入的字段名称和升降序条件在mybatis里动态拼接sql语句进行查询
  • Java类成员变量的默认值

    1 布尔型 boolean 变量默认值为false byte short int long为0 字符型为 u0000 空字符 浮点型 float double 为0 0 引用类型 String 为null package cn nxl201
  • shell算数运算

    i j k 等价于 i expr j k i j k 等价于 i expr j k i j k 等价于 i expr j k i j k 等价于 i expr j k Let expressions 执行一个或多个表达式 表达式中的变量前不
  • 量化投资学习-15:散户与庄家共赢策略之价值长线策略

    散户的尴尬 在前面的文章 量化投资学习 13 一张图残酷的展现了庄家 量化交易者 散户的盈利空间的对比 中分析过 如果散户追求短期利益 采用短期炒作的操作策略 实际的利润空间非常狭小 只能是尾部或头部空间 稍不留神 就会导致亏损 化解尴尬的
  • 微信小程序接入微信支付(四):接收支付结果通知与沙箱测试

    代码主体写完后 还有不可或缺的部分需要补充完整 即接收支付结果通知 官方文档 https pay weixin qq com wiki doc api wxa wxa api php chapter 9 7 index 8 目录 微信小程序
  • 线程的基本概念,线程的同步互斥机制

    一 线程的概念 1 1 什么是线程 线程 线程是进程的一个实体 是被系统独立调度和分派的基本单位 是一个进程并发执行多个任务的机制 并发 单核CPU多任务同时运行 CPU以ms级进行进程调度 1 2 为什么引入线程 进程间的切换表现为上下文
  • 计算机设备显示感叹号,设备管理器有感叹号和问号未知设备的解决方法

    设备管理器有感叹号和问号未知设备怎么办 因为在Windows操作系统中 设备管理器是管理计算机硬件设备的工具 我们可以借助设备管理器查看计算机中所安装的硬件设备 设置设备属性 安装或更新驱动程序 停用或卸载设备 可以说是功能非常强大 但有时
  • VC 如何使程序运行后自己删除自己

    VC 如何使程序运行后自己删除自己 有时候 我们需要创建一个运行后能够自己删除自己的可执行程序即自删除程序 很明显如果一个进程通过直接调用DeleteFile 来删除自己是不可能的 必须另想办法 经过本人在网上参考很多资料后实际测试并集众家