您的位置:首页 > 编程语言 > C语言/C++

VC++实现文件的自我删除

2013-01-08 15:23 316 查看
BOOL SelfDel1()

{

SHELLEXECUTEINFO sei;

TCHAR szModule [MAX_PATH],szComspec[MAX_PATH],szParams [MAX_PATH];

// 获得文件名.

if((GetModuleFileName(0,szModule,MAX_PATH)!=0) &&

(GetShortPathName(szModule,szModule,MAX_PATH)!=0) &&

(GetEnvironmentVariable("COMSPEC",szComspec,MAX_PATH)!=0))

{

// 设置命令参数.

lstrcpy(szParams,"/c del ");

lstrcat(szParams, szModule);

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;

// 执行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;

}

BOOL SelfDel2()

{

CStdioFile file;

CFileException fileEx;

TCHAR szDir[MAX_PATH];

TCHAR szModule[MAX_PATH];

GetModuleFileName(0, szModule, sizeof(szModule)); // 获得应用程序名.

GetCurrentDirectory(MAX_PATH, szDir); // 获得文件的当前目录.

CString strFilePath=CString(szDir)+"tempDel.bat"; // 临时批处理文件名.

if(!file.Open(strFilePath,CFile::modeWrite |

CFile::typeText | CFile::modeCreate,&fileEx))

{

#ifdef _DEBUG

afxDump << "The file could not be opened " << strFilePath<<"\n";

afxDump << "Cause :"<<fileEx.m_cause << "\n";

#endif

return FALSE;

}

CString strCmdLine1,strCmdLine2;

strCmdLine1.Format("del %s\n",szModule);

strCmdLine2.Format("del %%0\n");

file.WriteString(strCmdLine1); // 写删除EXE的命令行.

file.WriteString(strCmdLine2); // 写删除BAT的命令行.

file.Close();

WinExec(strFilePath,SW_HIDE); // 执行自行删除操作.

return TRUE;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: