#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. 小程序 请求Promise简单封装

    最近做小程序在调用后台接口的时候感觉总写很长一串,很冗杂.非常想念vue中promise封装的写法,于是自己初步封装了一下. 1.url 接口地址 2.headers请求头 3. params 请求参 ...

  2. JWT与Session的比较

    如今,越来越多的项目开始采用JWT作为认证授权机制,那么它和之前的Session究竟有什么区别呢?今天就让我们来了解一下. JWT是什么 定义 JSON Web Token(JWT)是一个开放标准(R ...

  3. JS基础-全方面掌握继承

    前言 上篇文章详细解析了原型.原型链的相关知识点,这篇文章讲的是和原型链有密切关联的继承,它是前端基础中很重要的一个知识点,它对于代码复用来说非常有用,本篇将详细解析JS中的各种继承方式和优缺点进行, ...

  4. Android服务之混合方式开启服务

    引言 前面介绍过了Android服务的两种开启方式:Start方式可以让服务在后台运行:bind方式能够调用到服务中的方法. 在实际的开发工作中,有很多需求是:既要在后台能够长期运行,又要在服务中操作 ...

  5. Linux常用命令(常用)

    一,Linux常用命令二,CentOS没有盘符,只有根目录/,可以理解为只有一个盘有一个文件夹有点特殊,画了一个房子,代表当前用户的家 1.记住一个点:区分根目录和当前用户的家cd ~ 代表回家cd ...

  6. 2018年蓝桥杯java b组第二题

    2.标题:方格计数 如图p1.png所示,在二维平面上有无数个1x1的小方格. 我们以某个小方格的一个顶点为圆心画一个半径为1000的圆.你能计算出这个圆里有多少个完整的小方格吗? 注意:需要提交的是 ...

  7. Kafka系列一之架构介绍和安装

    Kafka架构介绍和安装 写在前面 还是那句话,当你学习一个新的东西之前,你总得知道这个东西是什么?这个东西可以用来做什么?然后你才会去学习它,使用它.简单来说,kafka既是一个消息队列,如今,它也 ...

  8. Flask基础(07)-->正则自定义转换器

    正则自定义转换器 为什么要自定义正则转换器? 因为默认转换器太过于笨重,往往不能满足我们实际业务的需求,这时候我们就需要自定义正则转换器了. 那么我们怎么自定义正则转换器呢? from flask i ...

  9. 03-Django基础概念和MVT架构

    一.Django基础 掌握Django的 MVT 架构的使用 掌握Git管理源代码 主要内容 了解Django的 MVT 架构的使用流程 使用Django完成案例 : 书籍信息管理 MVC介绍 MVC ...

  10. 294 div2 C. A and B and Team Training

    C. A and B and Team Training 题目:A and B are preparing themselves for programming contests. An import ...