BOOL SelfDel()
{
	SHELLEXECUTEINFO sei;
	//字符串数组  
	TCHAR szModule[MAX_PATH], szComspec[MAX_PATH], szParams[MAX_PATH];

	//获得exe文件名
	//获取szComspec=cmd.exe  
	if ((GetModuleFileName(0, szModule, MAX_PATH) != 0) &&
		(GetShortPathName(szModule, szModule, MAX_PATH) != 0) &&
		(GetEnvironmentVariable(_T("COMSPEC"), szComspec, MAX_PATH) != 0))
	{
		// 设置命令参数.  
		lstrcpy(szParams,_T( "/c del "));
		lstrcat(szParams, szModule);
		lstrcat(szParams,_T( " > nul"));

		// 设置结构成员.  
		sei.cbSize = sizeof(sei);
		sei.hwnd = 0;
		sei.lpVerb = _T("Open");
		sei.lpFile = szComspec;
		sei.lpParameters = szParams;
		sei.lpDirectory = 0;
		sei.nShow = SW_HIDE;
		sei.fMask = SEE_MASK_NOCLOSEPROCESS;

		// 执行shell命令.  
		if (ShellExecuteEx(&sei))
		{
		  // 设置命令行进程的执行级别为空闲执行,使本程序有足够的时间从内存中退出.   
		  SetPriorityClass(sei.hProcess, IDLE_PRIORITY_CLASS);
		  SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
		  SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);

		  // 通知Windows资源浏览器,本程序文件已经被删除.  
		  SHChangeNotify(SHCNE_DELETE, SHCNF_PATH, szModule, 0);
		  return TRUE;
		}
	}
	return FALSE;
}

创建自删除bat文件

void  main()
{
	FILE *pf = fopen("1.bat", "w");
	fputs("taskkill /f /im 自删除.exe\n", pf);
	fputs("del  自删除.exe\n", pf);
	fputs("del 1.bat\n", pf);
	fclose(pf);
	system("1.bat");
	system("pause");
}