有个网站是做视频相册的,做响应式网站设计做图怎么搞,网站建设与应用岗位,怎么做网页买东西链接在Windows平台上实现一个守护进程#xff0c;由于与系统有关#xff0c;所有使用MFC来实现是最合适的#xff0c;被守护的进程则不限语言。废话不多#xff0c;直接开整。
目录
1. 开机自启动
2. 进程单例
3. 进程查询
4. 进程等待
5. 重启进程
6. 关闭进程
7、最后… 在Windows平台上实现一个守护进程由于与系统有关所有使用MFC来实现是最合适的被守护的进程则不限语言。废话不多直接开整。
目录
1. 开机自启动
2. 进程单例
3. 进程查询
4. 进程等待
5. 重启进程
6. 关闭进程
7、最后的最后 1. 开机自启动 守护进程自然要开机自启动。
//设置自身开机启动
BOOL SetSelfStart()
{//获取程序完整名称char pName[MAX_PATH] { 0 };GetModuleFileNameA(NULL, pName, MAX_PATH);//在注册表中写入启动信息HKEY hKey NULL;LONG lRet NULL;lRet RegOpenKeyExA(HKEY_LOCAL_MACHINE, SELFSTART_REGEDIT_PATH, 0, KEY_ALL_ACCESS, hKey);//判断是否成功if (lRet ! ERROR_SUCCESS){return FALSE;}lRet RegSetValueExA(hKey, w10_daemon, 0, REG_SZ, (const unsigned char*)pName, strlen(pName) sizeof(char));//判断是否成功if (lRet ! ERROR_SUCCESS){return FALSE;}//关闭注册表RegCloseKey(hKey);return TRUE;
}
2. 进程单例 也就是防止软件被多次启动在需要长时间无人值守运行的软件中不管守护进程或者被守护进程都不希望软件启动多次。
BOOL InitInstance()
{LPCWSTR pszExeName LGuardApplication; // 使用软件自身的名称// 用应用程序名创建信号量HANDLE hSem CreateSemaphore(NULL, 1, 1, pszExeName);// 信号量已存在// 信号量存在则程序已有一个实例运行if (GetLastError() ERROR_ALREADY_EXISTS){// 关闭信号量句柄CloseHandle(hSem);return FALSE;// 寻找先前实例的主窗口HWND hWndPrevious ::GetWindow(::GetDesktopWindow(), GW_CHILD);while (::IsWindow(hWndPrevious)){// 检查窗口是否有预设的标记?// 有则是我们寻找的主窗if (::GetProp(hWndPrevious, pszExeName)){// 主窗口已最小化则恢复其大小if (::IsIconic(hWndPrevious))::ShowWindow(hWndPrevious, SW_RESTORE);// 将主窗激活::SetForegroundWindow(hWndPrevious);// 将主窗的对话框激活::SetForegroundWindow(::GetLastActivePopup(hWndPrevious));// 退出本实例return FALSE;}// 继续寻找下一个窗口hWndPrevious ::GetWindow(hWndPrevious, GW_HWNDNEXT);}// 前一实例已存在但找不到其主窗// 可能出错了// 退出本实例return FALSE;}return TRUE;
}3. 进程查询 守护进程自然需要找到被守护的进程id等信息。
BOOL IsExistProcess(CONST WCHAR* szProcessName, DWORD ProcessID)
{PROCESSENTRY32 processEntry32;HANDLE toolHelp32Snapshot CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (((int)toolHelp32Snapshot) ! -1){processEntry32.dwSize sizeof(processEntry32);if (Process32First(toolHelp32Snapshot, processEntry32)){do{if (wcscmp(szProcessName, processEntry32.szExeFile) 0){ProcessID processEntry32.th32ProcessID;return TRUE;}} while (Process32Next(toolHelp32Snapshot, processEntry32));}CloseHandle(toolHelp32Snapshot);}return FALSE;
}
4. 进程等待 查寻到进程号之后最好的办法就是等待它退出而不是定时重复查询。
HANDLE hProcess OpenProcess(SYNCHRONIZE, FALSE, processEntry32.th32ProcessID);
if (hProcess ! NULL) {WaitForSingleObject(hProcess, INFINITE);CloseHandle(hProcess);
}
5. 重启进程 被守护的进程消失了怎么办当然是重启该进程喽。
WCHAR* pCmd Lcmd /c D:\\test\\abcd.exe;STARTUPINFOW si;
ZeroMemory(si, sizeof(si));
si.cb sizeof(si);
si.wShowWindow SW_HIDE;
si.dwFlags STARTF_USESHOWWINDOW;//进程对象
PROCESS_INFORMATION pi;
ZeroMemory(pi, sizeof(pi));//创建子进程判断是否执行成功
if (!CreateProcessW(NULL, pCmd, NULL, NULL, FALSE, 0, NULL, NULL, si, pi))
{cout 守护进程启动失败程序即将退出 endl;return 0;
}// 等待进程启动
WaitForInputIdle(pi.hProcess, 10000);// 获取进程窗口句柄
HWND hWnd FindWindow(NULL, PROCCESS_NAME);
if (hWnd)
{// 将进程窗口置顶SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);// 给予焦点SetForegroundWindow(hWnd);
}6. 关闭进程 为什么还要关闭进程呢当然是需要正常关闭其他进程的时候去做了比如被守护的进程不想被守护了自然需要先杀掉守护进程再然后自杀。
//利用查找到的进程ID打开进程
HANDLE hProcess OpenProcess(PROCESS_ALL_ACCESS, FALSE, processEntry32.th32ProcessID);//关闭进程
BOOL bRet TerminateProcess(hProcess, 0);CloseHandle(hProcess);7、最后的最后 当然是附上守护进程软件的源码链接了开源就要彻底你都看到这了还不给我点个赞加个关注吗就算白嫖也要自觉一点不是吗当然能给我打个赏我就万分感谢了
这是下载链接