前言
自删除: 顾名思义,这个程序功能很简单,就是实现程序的自删除功能。
是不是感到很困惑,一个程序自己运行着,怎样把自己关掉后,再把自己删除呢?结束自己进程的时候,自己也就结束了,不会再继续执行任何代码了。在程序执行的时候,文件处于打开状态,那也不能把自己给删了。是不是想不通啊,想不通就对了。
想不通找找镜子就明白了哈哈
实现原理
程序自删除实现的思路便是:程序创建一个批处理文件,并创建进程执行,然后程序结束进程;批处理所做的功能便是延时5秒后,删除指定程序然后再自删除。这样,程序自删除功能便实现了。
是不是很简单啊,马上就带你实现一下
测试案例
1.测试案例程序
就是个hello world
2. 批处理自删除文件
- 延时5秒
- 删除指定文件
- 删除批处理自身
代码段:
- 数据成员定义:
- 构造批处理文件路径
- 生成批处理文件
- 创建新的进程执行cmd命令
好了总体就是这个样子了
完整源码:
#include <Windows.h>
#include <stdio.h>
int _tmain(int argc, _TCHAR* argv[])
{
printf("任意按键,程序自删除!!!\n");
system("pause");
char szFileName[MAX_PATH] = {0};
char szCmdFileName[MAX_PATH] = {0};
char szCmd[MAX_PATH] = {0};
char szBat[MAX_PATH] = {0};
int iTime = 5;
// 构造批处理文件路径
::GetModuleFileName(NULL, szFileName, MAX_PATH);
::lstrcpy(szCmdFileName, szFileName);
char *p = ::strrchr(szCmdFileName, '\\');
p[0] = '\0';
::lstrcat(szCmdFileName, "\\selfdel.bat");
// 构造批处理内容
::wsprintf(szBat, "@echo off\nchoice /t %d /d y /n >nul\ndel %s\ndel %%0\n", iTime, szFileName);
// 生成批处理文件
FILE *fp = NULL;
fopen_s(&fp, szCmdFileName, "w+");
if (NULL == fp)
{
return 1;
}
fwrite(szBat, (1 + ::lstrlen(szBat)), 1, fp);
fclose(fp);
// 构造命令行
::wsprintf(szCmd, "cmd.exe /c call %s", szCmdFileName);
// 创建新的进程,以隐藏控制台的方式执行cmd命令行
STARTUPINFO si = { 0 };
PROCESS_INFORMATION pi;
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;//指定wShowWindow成员有效
si.wShowWindow = FALSE;//此成员设为TRUE的话则显示新建进程的主窗口
BOOL bRet = CreateProcess(
NULL,//不在此指定可执行文件的文件名
szCmd,//命令行参数
NULL,//默认进程安全性
NULL,//默认进程安全性
FALSE,//指定当前进程内句柄不可以被子进程继承
CREATE_NEW_CONSOLE,//为新进程创建一个新的控制台窗口
NULL,//使用本进程的环境变量
NULL,//使用本进程的驱动器和目录
&si,
&pi);
if (bRet)
{
//不使用的句柄最好关掉
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
return 0;
}
总结
这就是今天所用到的,更多C/C++内容,驻足C/C++学习乐园群Q:569268376