C语言之自删除技术

前言

自删除: 顾名思义,这个程序功能很简单,就是实现程序的自删除功能。

是不是感到很困惑,一个程序自己运行着,怎样把自己关掉后,再把自己删除呢?结束自己进程的时候,自己也就结束了,不会再继续执行任何代码了。在程序执行的时候,文件处于打开状态,那也不能把自己给删了。是不是想不通啊,想不通就对了。

想不通找找镜子就明白了哈哈

实现原理

程序自删除实现的思路便是:程序创建一个批处理文件,并创建进程执行,然后程序结束进程;批处理所做的功能便是延时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

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值