c语言程序,如何实现把本身程序删除。如打开1.exe,然后1.exe的功能就是删除本身,运行结束后
发布网友
发布时间:2022-08-17 07:07
我来回答
共2个回答
热心网友
时间:2023-10-10 21:26
程序自删除的方式有很多,不过最终的思想不过是关闭本身进程,开启新进程用于删除自身。下面这个方法是用windows自带命令行程序实现删除。
命令行为 cmd.exe /c del filename
--------------------------------------------------------------------------------
代码示例:C语言形式
#include
#include
#include
BOOL SelfDel()
{
SHELLEXECUTEINFO sei;
TCHAR szMole [MAX_PATH],szComspec[MAX_PATH],szParams [MAX_PATH];
// 获得自身文件名. 获取cmd的全路径文件名
if((GetMoleFileName(0,szMole,MAX_PATH)!=0) &&
(GetShortPathName(szMole,szMole,MAX_PATH)!=0) &&
(GetEnvironmentVariable("COMSPEC",szComspec,MAX_PATH)!=0))
{
// 设置命令参数.
lstrcpy(szParams,"/c del ");
lstrcat(szParams, szMole);
lstrcat(szParams, " > nul");
// 设置结构成员.
sei.cbSize = sizeof(sei);
sei.hwnd = 0;
sei.lpVerb = "Open";
sei.lpFile = szComspec;
sei.lpParameters = szParams;
sei.lpDirectory = 0; sei.nShow = SW_HIDE;
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
// 创建cmd进程.
if(ShellExecuteEx(&sei))
{
// 设置cmd进程的执行级别为空闲执行,使本程序有足够的时间从内存中退出.
SetPriorityClass(sei.hProcess,IDLE_PRIORITY_CLASS);
// 将自身进程的优先级置高
SetPriorityClass(GetCurrentProcess(),REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_TIME_CRITICAL);
// 通知Windows资源浏览器,本程序文件已经被删除.
SHChangeNotify(SHCNE_DELETE,SHCNF_PATH,szMole,0);
return TRUE;
}
}
return FALSE;
}
---------------------------------------------------------------------------------
热心网友
时间:2023-10-10 21:26
用system("xxx");调用命令行删除试试,不过不知道行不行,因为运行时必然被占用。