#include<stdio.h>
#include<windows.h>
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) // 设置入口地址实现隐藏窗口。
int main(void)
{
FILE *fp;
TCHAR buffer[MAX_PATH];
GetModuleFileName(NULL,buffer,MAX_PATH);
fp = fopen("del.bat","w");
fprintf(fp,"@echo off\r\n");
fprintf(fp,":start\r\n\tif not exist %s goto done\r\n",buffer);
fprintf(fp,"\tdel /f /q %s\r\n",buffer);
fprintf(fp,"goto start\r\n");
fprintf(fp,":done\r\n");
fprintf(fp,"\tdel /f /q %%0"); // 两个%%显示一个%,%0 代表自身。
fclose(fp);
ShellExecuteA(NULL,"open","del.bat",NULL,NULL,SW_HIDE);
return ;
}
bat 文件如下:

@echo off
:start
if not exist del.exe goto done
del /f /q del.exe
goto start
:done
del /f /q %0

GetModuleFileName() 介绍:

功能:获取当前进程已加载模块的文件的完整路径,该模块必须由当前进程加载。

函数原型:DWORD WINAPI GetModuleFileName( HMODULE  hModule, LPTSTR  lpFilename, DWORD  nSize) ;

参数:hModule 表示正在被加载模块的句柄,如果为 NULL,则将当前可执行文件的完整路径复制到 lpFilename 中

nSize 表示复制到 lpFilename 的最大字符数量。

返回值:如执行成功,返回复制到lpFileName的实际字符数量;零表示失败。

ShellExecute() 介绍:

功能:运行一个外部程序 (或者是打开一个已注册的文件、打开一个目录、打印一个文件等等),并对外部程序有一定的控制。

函数原型:HINSTANCE ShellExecute(
  HWND   hwnd,               // 指定父窗口句柄。
  LPCSTR lpOperation,    // 指定动作, 譬如: open、runas、print、edit、explore、find   (提示,可以打开网址
  LPCSTR lpFile,              // 指定要打开的文件或程序
  LPCSTR lpParameters,  // 给要打开的程序指定参数; 如果打开的是文件这里应该是 nil
  LPCSTR lpDirectory,       // 缺省目录
  INT    nShowCmd           // 打开选项  ---  SB_HIDE 代表隐藏窗口。
);

返回值:执行成功会返回应用程序句柄。
              返回的HINSTANCE可以将它转换为一个整数(%d),并比较它的值大于还是小于32或比较它的错误代码
              返回值大于32表示执行成功,返回值小于32表示执行错误。
 
ShellExecuteEX() 介绍:
功能:ShellExecute() 的扩展,对指定的文件进行操作。
函数原型:BOOL ShellExecuteEx(
                  SHELLEXECUTEINFO *pExecInfo  // 一个指向 SHELLEXECUTEINFO 结构的指针。
                  );
返回值:返回 TRUE 表示成功,FALSE 表示失败。
 
SHELLEXECUTEINFO 结构体:
typedef struct _SHELLEXECUTEINFO {
DWORD cbSize; // 该结构体大小。
ULONG fMask; // 指示其他结构成员的内容和有效性的标志,默认为 0。
HWND hwnd; // 父窗口句柄(用于显示执行该函数时可能出现的任何消息框),可以为 NULL。
LPCSTR lpVerb; // 指定要执行的操作,可以为 NULL。同上 lpOperation,runas 代表以管理员身份运行。
LPCSTR lpFile; // 指定将执行由 lpVerb 参数指定的操作的文件或对象的名称。
LPCSTR lpParameters; // 执行参数,可以为 NULL。
LPCSTR lpDirectory; // 工作目录,可以为 NULL。
int nShow; // 窗体显示方式。
HINSTANCE hInstApp; // 出参,用于了解该函数是否调用成功,可以为 NULL。
void *lpIDList; // ITEMIDLIST结构的地址,存储成员的特别标识符。
LPCSTR lpClass; // 指明文件类别的名字或 GUID,可以为 NULL。
HKEY hkeyClass; // 文件类型的注册表项的句柄,可以为 NULL。
DWORD dwHotKey; // 与应用程序关联的键盘快捷键,可以为 NULL。
union {
HANDLE hIcon; // 取得对应文件类型的图标的Handle,可以为 NULL。
HANDLE hMonitor; // 将文档显示在显示器上的Handle,可以为 NULL。
} DUMMYUNIONNAME;
HANDLE hProcess; // 指向新启动的程序的句柄,可以为 NULL。
} SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO;

C 自删除技术---批处理方式的更多相关文章

  1. 短视频 SDK 功能点技术实现方式详解

    第三方短视频解决方案作为快速切入短视频行业的首选方式,选择一款功能齐全.性能优异的短视频解决方案十分重要. 今天我们来谈谈短视频 SDK 6大重要功能点及其技术实现方式. 短视频拍摄 断点续拍 指在拍 ...

  2. 短视频 SDK 6大功能技术实现方式详解

    第三方短视频解决方案作为快速切入短视频行业的首选方式,选择一款功能齐全.性能优异的短视频解决方案十分重要. 今天我们来谈谈短视频 SDK 6大重要功能点及其技术实现方式. 短视频拍摄 断点续拍 指在拍 ...

  3. FluentData - 轻量级.NET ORM持久化技术解决方式

    FluentData - 轻量级.NET ORM持久化技术解决方式   文件夹:    一.什么是ORM?  二.使用ORM的优势  三.使用ORM的缺点  四.NET下的ORM框架有哪些?  五.几 ...

  4. Windows Server 2012重复数据删除技术体验

    在企业环境中,对磁盘空间的需求是惊人的.数据备份.文件服务器.软件镜像.虚拟磁盘等都需要占据大量的空间.对此,微软在Windows Server 2012中引入了重复数据删除技术.重复数据删除技术通过 ...

  5. 这才是正确删除 office 的方式

    https://support.office.com/zh-cn/article/%E9%80%9A%E8%BF%87%E5%9C%A8%E9%87%8D%E6%96%B0%E5%AE%89%E8%A ...

  6. 复选框批量删除操作-jquery方式

    1.首先在页面添加一个批量删除的按钮:<li class="btns"><input id="deleteSubmit" class=&quo ...

  7. JDBC2.0操作:结果集,更新,插入,删除,批处理语句

    JDBC对ResultSet的支持 JDBC最重要的概念是批处理,可以一次完成多个语句的执行. 可滚动的结果集. 如果想创建可滚动的结果集,则在创建PrepareStatement时候必须指定创建的类 ...

  8. Spring框架中的AOP技术----注解方式

    利用AOP技术注解的方式对功能进行增强 CustomerDao接口 package com.alphajuns.demo1; public interface CustomerDao { public ...

  9. Spring框架中的AOP技术----配置文件方式

    1.AOP概述 AOP技术即Aspect Oriented Programming的缩写,译为面向切面编程.AOP是OOP的一种延续,利用AOP技术可以对业务逻辑的各个部分进行隔离,从使得业务逻辑各部 ...

随机推荐

  1. FreeSql (五)插入数据

    var connstr = "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;" + "Initia ...

  2. 行数据库VS列数据库

    一.介绍 目前大数据存储有两种方案可供选择:行存储和列存储.业界对两种存储方案有很多争持,集中焦点是:谁能够更有效地处理海量数据,且兼顾安全.可靠.完整性.从目前发展情况看,关系数据库已经不适应这种巨 ...

  3. java架构之路-(源码)mybatis执行流程源码解析

    这次我们来说说Mybatis的源码,这里只说执行的流程,内部细节太多了,这里只能授之以渔了.还是最近的那段代码,我们来回顾一下. package mybatis; import mybatis.bea ...

  4. 一步步到IOC

    一段代码 class Program { static void Main(string[] args) { var shop=new Shop(); shop.Add(); shop.Delete( ...

  5. jmeter 分布式压测

    1.配置主机名称 查看主机名 hostname 配置主机别名 vim /etc/hosts 2.分布式主机也需要配置主机别名 3.每个主机上必需有JAVA环境和jmeter环境 4.如果脚本有参数文件 ...

  6. 使用Hexo搭建个人博客并部署到GitHub或码云上全过程

    一.前言 如上图所示:GitHub有Github Pages,而码云也有码云 Pages 1.Github Pages或Gitee Pages是什么呢? Github Pages或者Gitee Pag ...

  7. git rebase 与 merge 的那些事儿~(详细图解,通俗易懂)

    什么是 rebase? git rebase 你其实可以把它理解成是"重新设置基线",将你的当前分支重新设置开始点.这个时候才能知道你当前分支于你需要比较的分支之间的差异. 原理很 ...

  8. React开发后台管理系统

    1.基础插件安装,less文件加载配置  安装基础插件 安装React-Router .Axios yarn add react-router-dom axios less-loader(router ...

  9. springboot应用在tomcat中运行

    1.将打包方式改成war,因为如果是java -jar xx.jar方式运行,一定是jar包 <packaging>war</packaging> 2.添加tomcat的依赖, ...

  10. jenkins自动化部署项目4 -- 安装和配置jdk、maven、git

    Jenkins提供了自动安装jdk,maven,git的功能,在[系统设置-全局工具配置]里,但是我自动安装没反应,因此我是先手工安装和配置它们的环境变量然后再在[系统设置-全局工具配置]里配置: 1 ...