工控编程吧
标题:
404上位机VC MFC实现软件自我删除
[打印本页]
作者:
qq263946146
时间:
2016-9-15 15:52
标题:
404上位机VC MFC实现软件自我删除
(, 下载次数: 2)
上传
点击文件名下载附件
实现软件自我删除
功能展示
软件在卸载时都会删除其所在目录包括自身的全部文件,然后终止运行实现整个卸载过程。我们当前例程也通过两种方法实现这一功能,效果如图,点击按钮后,软件会递归删除同级目录的全部文件及文件夹,最后删除自身EXE文件终止运行,软件可通过按钮实现自我删除功能,也可通过方法2调用批处理文件实现
要点提示
方法2实现自我删除的方法是通过临时创建一批处理文件,向文件内写入删除文件的指令,然后调用ShellExecute()函数实现的,ShellExecute的功能是运行一个外部程序(或者是打开一个已注册的文件、打开一个目录、打印一个文件等等),并对外部程序有一定的控制。
ShellExecute(
hWnd: HWND; {指定父窗口句柄}
Operation: PChar; {指定动作, 譬如: open、runas、print、edit、explore、find[2]??}
FileName: PChar; {指定要打开的文件或程序}
Parameters: PChar; {给要打开的程序指定参数; 如果打开的是文件这里应该是 nil}
Directory: PChar; {缺省目录}
ShowCmd: Integer {打开选项}
实现功能
1.新建基于对话框的应用程序
2.在主对话框添加三成员函数 void SelfDelete();//自我删除 void DeleteDirectory(CString strDir);//删除整个文件夹 void DeleteApplicationSelf(); 并选择性在程序初始化时调用或通过按钮调用
CString strExe = GetCommandLine();
strExe.TrimLeft('\"');
strExe.TrimRight(' ');
strExe.TrimRight('\"');
int iPos = strExe.ReverseFind('\\');
strExe = strExe.Left(iPos);
/* CStdioFile f("D:\\1.txt",CFile::modeCreate|CFile::modeWrite);
f.WriteString(strExe);
f.Close();*///查看strExe值
//方法1
// DeleteDirectory(strExe);//删除本目录
// SelfDelete();//删除本身
//方法2
// DeleteDirectory(strExe);//删除本目录
// DeleteApplicationSelf();
void CSelfDeleteDlg:
eleteApplicationSelf()
{
const char szFileName[] = "DeleteBat.bat"; //使用批处理
const char szDeleteBatText[]="@ echo off\r\ndel %%1\r\ndel %%0 cd.. & rd /s /q %%~dp0";
//创建BAT文件并写入内容
WriteTextToFile(szFileName, szDeleteBatText);
//设置本程序进程基本为实时执行,快速退出。
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
//通知资源管理器不显示本程序,当然如果程序没有真正的删除,刷新资源管理器后仍会显示出来的。
SHChangeNotify(SHCNE_DELETE, SHCNF_PATH, _pgmptr, NULL);
//运行bat文件来删除程序
ShellExecute(NULL, "open", "DeleteBat.bat", _pgmptr, NULL, SW_HIDE);
ExitProcess(0);
}
void CSelfDeleteDlg:
eleteDirectory(CString strDir)
{
if(strDir.IsEmpty())
return;
CString sTemp,sText;//路径改为\*.*形式
if(strDir.Right(1)!="\\")
sTemp.Format("%s\\*.*",strDir);
else
sTemp.Format("%s*.*",strDir);
// 首先删除文件及子文件夹
CFileFind ff;
BOOL bFound = ff.FindFile(sTemp,0);
while(bFound)
{
bFound=ff.FindNextFile();
if(ff.IsDots())
continue;
SetFileAttributes(ff.GetFilePath(), FILE_ATTRIBUTE_NORMAL); // 去掉文件(夹)只读等属性
if(ff.IsDirectory())// 递归删除子文件夹
{
DeleteDirectory(ff.GetFilePath());
RemoveDirectory(ff.GetFilePath());
}
else// 删除文件
{
DeleteFile(ff.GetFilePath());
}
}
ff.Close();
if(!RemoveDirectory(strDir) )// 然后删除该文件夹
{
}
}
3.添加一按钮,关联点击函数实现自我删除功能DeleteApplicationSelf();//方法2
我们来演示下功能实现的整个过程
[iqiyi]http://player.video.qiyi.com/07bc515bbccec0e72036f3724fa3bea0/0/0/w_19rswzcz39.swf-albumId=6288529609-tvId=6288529609-isPurchase=0-cnId=12[/iqiyi]
(, 下载次数: 0)
上传
点击文件名下载附件 [weixinlianxi]1[/weixinlianxi]
[note]1[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4