这个问题其实不难,这位仁兄的帖子已经说了三种方法
http://blog.csdn.net/jimmy_w/archive/2007/01/14/1483055.aspx
这个问题其实很简单,就是在进程结束后能有另外一个进程将此程序删除,这个问题解决了那么就迎刃而解了。在程序关闭前启动一个线程,此线程生成一个删除进程,那么这时删除进程和本进程是同步的,且不会因本进程关闭而终止,所以EXE自删除的问题就解决了。
//生成线程
HANDLE UiThreadHandle;
DWORD WINAPI UiListShowThread (LPVOID lpVoid){
// Sleep(500);
EDosFunction edf;
edf.eDosTest1();
return 1;
}
void CtestdosDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
UiThreadHandle = CreateThread(NULL, 0,UiListShowThread, 0, 0, 0);
SetThreadPriority(UiThreadHandle,30);
OnOK();
}
//生成删除进程,我的EXE的名称是testdos.exe,当然也可以通过API动态获取本文件名称
void EDosFunction::eDosTest1(){
PROCESS_INFORMATION pi;
STARTUPINFO si ;
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.wShowWindow = SW_SHOW;
si.dwFlags = STARTF_USESHOWWINDOW;
DWORD dwWritten;
CString cCommandLine="cmd /c del testdos.exe";
BOOL ret = CreateProcess(NULL, cCommandLine.GetBuffer(cCommandLine.GetLength()), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
cCommandLine.ReleaseBuffer();
HANDLE hProcess=pi.hProcess;
// CloseHandle( pi.hProcess );
//CloseHandle( pi.hThread );
//HANDLE hProcess = GetCurrentProcess();//get current process
// TerminateProcess(pi.hProcess,0);
}
void EDosFunction::eDosTest1(){
PROCESS_INFORMATION pi;
STARTUPINFO si ;
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.wShowWindow = SW_SHOW;
si.dwFlags = STARTF_USESHOWWINDOW;
DWORD dwWritten;
CString cCommandLine="cmd /c del testdos.exe";
BOOL ret = CreateProcess(NULL, cCommandLine.GetBuffer(cCommandLine.GetLength()), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
cCommandLine.ReleaseBuffer();
HANDLE hProcess=pi.hProcess;
// CloseHandle( pi.hProcess );
//CloseHandle( pi.hThread );
//HANDLE hProcess = GetCurrentProcess();//get current process
// TerminateProcess(pi.hProcess,0);
}
本文介绍了一种在Windows环境下实现可执行文件(EXE)自我删除的方法。具体来说,通过在程序退出前创建一个独立线程来启动一个专门用于删除当前运行EXE文件的进程。该方法利用CreateProcess API来生成一个执行命令行参数为删除指定EXE文件的子进程。

985

被折叠的 条评论
为什么被折叠?



