在卸载windows应用程序时,要求删除安装目录下的文件。但是怎样让卸载程序(uninstall.exe)能够删除自身呢?
方法一:
在最后删除安装目录下的文件时,创建一个bat文件,在bat里执行删除unistall.exe的操作,并且最后删除bat文件自身。
void ClearInstallDir(std::wstring strPath)
{
ofstream file;
file.open("del.bat");
file<<"cd /d \"";
file<<strPath.c_str();
file<<"\""<<endl;
file<<"del /s /q /f *.*"<<endl;
file<<"del del.bat"<<endl;
file.close();
ShellExecute(NULL,L"open",L"del.bat",L"",NULL,SW_SHOWNORMAL);
}
方法二:
使用延迟删除/重命名方法,具体参考MSDN对MoveFileEx接口的描述及其使用。
延迟删除文件方法:MoveFileEx(szDstFile, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
延迟重命名文件方法:MoveFileEx(szSrcFile, szDstFile, MOVEFILE_DELAY_UNTIL_REBOOT);
想详细了解延迟删除的概念及原理,请自行google。
延迟删除/重命名文件,需要在重启计算机之后执行,下面给出一段重启计算机的代码。
BOOL SystemReboot() { HANDLE hToken; TOKEN_PRIVILEGES tkp; if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken)) return FALSE; LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0); if (GetLastError() != ERROR_SUCCESS) return FALSE; if (!ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0)) return FALSE; return TRUE; }