早些年自己写了一个程序打包的安装程序,里面具备了卸载功能。前几天有群友问到了这个问题,程序怎么在退出的时候删除自身?也有人问A进程怎么去关闭B进程?其实实现思路都一样,都是可以通过借刀杀人(程序自身是无法删除自身的,所以要想删除自身都是通过另外一个程序)来完成。以下是非Unicode下实现代码(Unicode请自行修改):
void UnintallSelfApplication()
{
// 设置进程优先级-实时,使其抢先于操作系统组件之前运行
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
// 设置线程优先级-实时
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
// 获取当前工作进程(exe)的完整路径,也可以通过GetModuleFileName函数来完成
char* lpszFilePath = NULL;
_get_pgmptr(&lpszFilePath);
// 通知资源管理器,删除工作进程文件
SHChangeNotify(SHCNE_DELETE, SHCNF_PATH, lpszFilePath, NULL);
char szCommandLine[MAX_PATH + 10];
sprintf_s(szCommandLine, "/c del /q %s", lpszFilePath);
// 隐藏启动控制台程序,执行删除文件指令
ShellExecute(NULL, "open", "cmd.exe", szCommandLine, NULL, SW_HIDE);
// 退出当前进程
ExitProcess(ERROR_SUCCESS);
}