当前位置: 首页 > news >正文

英文站网站源码快车app官方下载

英文站网站源码,快车app官方下载,网站seo优化技能,平面设计优秀作品解析目录 一、关于 Restart Manager 二、重启管理器实例 三、完整实现代码和测试 本文属于原创文章#xff0c;转载请注明出处#xff1a; https://blog.csdn.net/qq_59075481/article/details/136179191。 我们往往使用 TerminateProcess 并传入 PID 和特殊结束代码 1 或者…目录 一、关于 Restart Manager 二、重启管理器实例 三、完整实现代码和测试 本文属于原创文章转载请注明出处 https://blog.csdn.net/qq_59075481/article/details/136179191。 我们往往使用 TerminateProcess 并传入 PID 和特殊结束代码 1 或者 taskkill /f /im 等方法重启资源管理器( explorer.exe )其实这是不正确的。我们应该使用重启管理器接口来重启 explorer 进程。 一、关于 Restart Manager 重启管理器 API 可以消除或减少完成安装或更新所需的系统重启次数。软件更新在安装或更新期间需要重启系统的主要原因是正在运行的应用程序或服务当前正在使用某些正在更新的文件。 重启管理器允许关闭并重启除关键系统服务外的所有服务 。这会释放正在使用的文件并允许完成安装操作。 安装程序可以使用重启管理器来注册应在安装应用程序或更新期间替换的文件。然后在后续更新或安装期间安装程序可以使用重启管理器来确定哪些文件因当前正在使用而无法更新。重启管理器可以关闭并重启当前使用这些文件的非关键服务或应用程序。安装程序可以指示重启管理器根据正在使用的文件、进程 ID (PID) 或 Windows 服务的短名称来关闭和重启应用程序或服务。 二、重启管理器实例 实现一个简易的重启管理器实例主要需要 RmStartSession 、RmRegisterResources、RmShutdown、RmEndSession 等函数。 首先我们需要在代码中引入头文件 #include restartmanager.h #pragma comment(lib, Rstrtmgr.lib) 然后我们用 RmStartSession 创建会话。其中会话的密钥是 GUID 为其分配缓冲区时候需要计算好缓冲区大小。 #define RM_SESSIONKEY_LEN sizeof(GUID) * 2 1 DWORD dwRmStatus 0; DWORD dwSessionHandle 0; WCHAR strSessionKey[RM_SESSIONKEY_LEN] { 0 }; dwRmStatus RmStartSession(dwSessionHandle, NULL, strSessionKey); if (ERROR_SUCCESS ! dwRmStatus) {std::cerr RmStartSession failed: std::dec dwRmStatus std::endl;return -1; } 随后需要将要重启的进程信息放到 RM_UNIQUE_PROCESS 结构体数组中该结构体如下 typedef struct _RM_UNIQUE_PROCESS {DWORD dwProcessId;FILETIME ProcessStartTime; } RM_UNIQUE_PROCESS, *PRM_UNIQUE_PROCESS; 第一个是进程的 PID第二个是进程的创建时间使用 GetProcessTimes 函数的 lpCreationTime 参数获取。 BOOL GetProcessTimes([in] HANDLE hProcess,[out] LPFILETIME lpCreationTime,[out] LPFILETIME lpExitTime,[out] LPFILETIME lpKernelTime,[out] LPFILETIME lpUserTime ); 我使用 Toolhelp32 枚举 explorer 进程并生成 RM_UNIQUE_PROCESS 结构体数组。 BOOL GetShellProcessRmInfoEx(PRM_UNIQUE_PROCESS* lpRmProcList, DWORD_PTR* lpdwCountNum ) {PROCESSENTRY32W pe32 { 0 };FILETIME lpCreationTime { 0 };FILETIME lpExitTime { 0 };FILETIME lpKernelTime { 0 };FILETIME lpUserTime { 0 };HANDLE hProcess nullptr;RM_UNIQUE_PROCESS tpProc { 0 };std::vectorRM_UNIQUE_PROCESS RmProcVec;SIZE_T VecLength 0;// 在使用这个结构前先设置它的大小pe32.dwSize sizeof(pe32);// 给系统内所有的进程拍个快照HANDLE hProcessSnap CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (hProcessSnap INVALID_HANDLE_VALUE){std::cerr CreateToolhelp32Snapshot 调用失败. std::endl;return FALSE;}// 遍历进程快照轮流显示每个进程的信息BOOL bMore Process32FirstW(hProcessSnap, pe32);while (bMore){if (!_wcsicmp(pe32.szExeFile, Lexplorer.exe)){hProcess OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pe32.th32ProcessID);if (hProcess ! nullptr){memset(lpCreationTime, 0, sizeof(FILETIME));if (GetProcessTimes(hProcess,lpCreationTime, lpExitTime,lpKernelTime, lpUserTime) TRUE){tpProc.dwProcessId pe32.th32ProcessID;tpProc.ProcessStartTime lpCreationTime;RmProcVec.push_back(tpProc);}CloseHandle(hProcess);hProcess nullptr;}}bMore Process32NextW(hProcessSnap, pe32);}// 清除 snapshot 对象CloseHandle(hProcessSnap);VecLength RmProcVec.size();if (VecLength ! 0 VecLength (SIZE_T)0xf4236u){RM_UNIQUE_PROCESS* lprmUniqueProc new(std::nothrow) RM_UNIQUE_PROCESS[VecLength];if (lprmUniqueProc ! nullptr){SIZE_T rSize VecLength * sizeof(RM_UNIQUE_PROCESS);if (rSize (SIZE_T)0xC80000u rSize 0){if (!memcpy_s(lprmUniqueProc, rSize, RmProcVec[0], rSize)){*lpdwCountNum VecLength;*lpRmProcList lprmUniqueProc;return TRUE;}}else {std::cerr Vector Size to large! std::endl;}}else {std::cerr Alloc memory failed! std::endl;}}else {std::cerr Vector Size to large! std::endl;}return FALSE; } 使用 RmRegisterResources 函数将资源注册到重启管理器会话。重启管理器使用向会话注册的资源列表来确定必须关闭和重启哪些应用程序和服务。 可以通过文件名、服务短名称或描述正在运行的应用程序 RM_UNIQUE_PROCESS 结构来标识资源。参数解释如下 参数解释 代码如下  dwRmStatus RmRegisterResources(dwSessionHandle,0, NULL, dwNum, lpRmProcList, 0, NULL); if (ERROR_SUCCESS ! dwRmStatus) {std::cerr RmRegisterResources failed: std::dec dwRmStatus std::endl;RmProcMemFree(lpRmProcList, lpdwCountNum);return -1; } 然后使用 RmShutdown 就可以请求结束进程可以指定第二个参数来选择强制或者非强制两种状态。 完成任务后使用 RmRestart 重新启动被关闭的进程即可程序会尝试恢复并刷新状态。 所有操作完成后使用 RmEndSession 关闭会话句柄。 三、完整实现代码和测试 完整代码如下 #include iostream #include Windows.h #include restartmanager.h #include TlHelp32.h #include vector#pragma comment(lib, Rstrtmgr.lib)#define RM_SESSIONKEY_LEN sizeof(GUID) * 2 1BOOL GetShellProcessRmInfoEx(PRM_UNIQUE_PROCESS* lpRmProcList,DWORD_PTR* lpdwCountNum ); void RmProcMemFree(PRM_UNIQUE_PROCESS lpRmProcList,DWORD_PTR lpdwCountNum );void RmWriteStatusCallback(UINT nPercentComplete );int main() {DWORD dwRmStatus 0;DWORD dwSessionHandle 0;WCHAR strSessionKey[RM_SESSIONKEY_LEN] { 0 };dwRmStatus RmStartSession(dwSessionHandle, NULL, strSessionKey);if (ERROR_SUCCESS ! dwRmStatus){std::cerr RmStartSession failed: std::dec dwRmStatus std::endl;return -1;}PRM_UNIQUE_PROCESS lpRmProcList nullptr;DWORD_PTR lpdwCountNum 0;if (!GetShellProcessRmInfoEx(lpRmProcList, lpdwCountNum)){std::cerr GetShellProcessRmInfoEx failed. std::endl;return -1;}UINT dwNum static_castUINT(lpdwCountNum);std::cout Process Count: dwNum std::endl;std::cout Shell PID: std::endl;for (UINT i 0; i dwNum; i){std::cout lpRmProcList[i].dwProcessId std::endl;}dwRmStatus RmRegisterResources(dwSessionHandle,0, NULL, dwNum, lpRmProcList, 0, NULL);if (ERROR_SUCCESS ! dwRmStatus){std::cerr RmRegisterResources failed: std::dec dwRmStatus std::endl;RmProcMemFree(lpRmProcList, lpdwCountNum);return -1;}dwRmStatus RmShutdown(dwSessionHandle, RmForceShutdown, RmWriteStatusCallback);if (ERROR_SUCCESS ! dwRmStatus){std::cerr RmShutdown failed: std::dec dwRmStatus std::endl;// return -1;}Sleep(5000);dwRmStatus RmRestart(dwSessionHandle, 0, RmWriteStatusCallback);if (ERROR_SUCCESS ! dwRmStatus){std::cerr RmRestart failed: std::dec dwRmStatus std::endl;// return -1;}dwRmStatus RmEndSession(dwSessionHandle);if (ERROR_SUCCESS ! dwRmStatus){std::cerr RmEndSession failed: std::dec dwRmStatus std::endl;// return -1;}RmProcMemFree(lpRmProcList, lpdwCountNum);return 0; }void RmWriteStatusCallback(UINT nPercentComplete ) {std::cout Task completion level: std::dec nPercentComplete std::endl; }BOOL GetShellProcessRmInfoEx(PRM_UNIQUE_PROCESS* lpRmProcList, DWORD_PTR* lpdwCountNum ) {PROCESSENTRY32W pe32 { 0 };FILETIME lpCreationTime { 0 };FILETIME lpExitTime { 0 };FILETIME lpKernelTime { 0 };FILETIME lpUserTime { 0 };HANDLE hProcess nullptr;RM_UNIQUE_PROCESS tpProc { 0 };std::vectorRM_UNIQUE_PROCESS RmProcVec;SIZE_T VecLength 0;// 在使用这个结构前先设置它的大小pe32.dwSize sizeof(pe32);// 给系统内所有的进程拍个快照HANDLE hProcessSnap CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (hProcessSnap INVALID_HANDLE_VALUE){std::cerr CreateToolhelp32Snapshot 调用失败. std::endl;return FALSE;}// 遍历进程快照轮流显示每个进程的信息BOOL bMore Process32FirstW(hProcessSnap, pe32);while (bMore){if (!_wcsicmp(pe32.szExeFile, Lexplorer.exe)){hProcess OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pe32.th32ProcessID);if (hProcess ! nullptr){memset(lpCreationTime, 0, sizeof(FILETIME));if (GetProcessTimes(hProcess,lpCreationTime, lpExitTime,lpKernelTime, lpUserTime) TRUE){tpProc.dwProcessId pe32.th32ProcessID;tpProc.ProcessStartTime lpCreationTime;RmProcVec.push_back(tpProc);}CloseHandle(hProcess);hProcess nullptr;}}bMore Process32NextW(hProcessSnap, pe32);}// 清除 snapshot 对象CloseHandle(hProcessSnap);VecLength RmProcVec.size();if (VecLength ! 0 VecLength (SIZE_T)0xf4236u){RM_UNIQUE_PROCESS* lprmUniqueProc new(std::nothrow) RM_UNIQUE_PROCESS[VecLength];if (lprmUniqueProc ! nullptr){SIZE_T rSize VecLength * sizeof(RM_UNIQUE_PROCESS);if (rSize (SIZE_T)0xC80000u rSize 0){if (!memcpy_s(lprmUniqueProc, rSize, RmProcVec[0], rSize)){*lpdwCountNum VecLength;*lpRmProcList lprmUniqueProc;return TRUE;}}else {std::cerr Vector Size to large! std::endl;}}else {std::cerr Alloc memory failed! std::endl;}}else {std::cerr Vector Size to large! std::endl;}return FALSE; }void RmProcMemFree(PRM_UNIQUE_PROCESS lpRmProcList, DWORD_PTR lpdwCountNum) {__try{DWORD_PTR dwCountNum lpdwCountNum;if (lpRmProcList ! nullptr dwCountNum 0){while (--dwCountNum){if (IsBadWritePtr(lpRmProcList[dwCountNum], sizeof(RM_UNIQUE_PROCESS))){throw(LBadWritePtr event!);break;}memset(lpRmProcList[dwCountNum], 0, sizeof(RM_UNIQUE_PROCESS));}delete[] lpRmProcList;}}__except (EXCEPTION_EXECUTE_HANDLER){// 处理 SEH 异常std::cerr Error access violation. std::endl;exit(-1);} } 测试效果如图所示 测试结果截图 测试内容首先结束所有 explorer 进程随后重启进程。  本文属于原创文章转载请注明出处 https://blog.csdn.net/qq_59075481/article/details/136179191。 文章发布于2024.02.19更新于2024.02.19.
http://www.w-s-a.com/news/878997/

相关文章:

  • wordpress设置密码访问带提示广州做网站优化哪家专业
  • 如何帮人做网站赚钱西安室内设计公司排名
  • 房产网站建设产品网站域名和邮箱域名
  • 网站建设核心优势seo求职信息
  • 网站手册自己在百度上可以做网站吗
  • 影楼网站源码建行业网站的必要性
  • 深圳app网站设计软件开发公司税收优惠政策
  • 北京市中关村有哪家可以做网站维护客户管理系统 wordpress
  • 做网站拉客户有效吗全景图网页制作工具
  • 网站建设公司行业建设网站需要提供什么资料
  • 别人的做网站网页打不开图片
  • 北京专业网站设计推荐怎么建立网站网址
  • 上海网站建设开发公司哪家好网站数据搬家
  • 杭州建站平台哪里有免费的网站推广软件
  • 深圳极速网站建设服务什么网站可以做产品入驻
  • 淄博易宝网站建设app推广拉新公司
  • 营销型外贸网站建设软件备案域名出租
  • 网站域名禁止续费m99ww094cn 苍井空做的网站
  • 上海建设工程网站大同网站建设熊掌号
  • 设计类书籍网站江苏网站建设简介模板
  • 手机企业网站推广c 手机app开发
  • 网站建设需要多少天凡客建设网站稳定吗
  • 房天下网站建设女生说wap是什么意思
  • 网站开发安全机制北京做网站多少钱合理
  • 扁平化 公司网站建设大型视频网站需要的资金量
  • 免费建各种网站淄博网站建设yx718
  • 凡科网建站入门教程运城市网站建设
  • 黄浦区未成年人思想道德建设网站oa系统是什么
  • 微信里的网站怎么做电子商务网站开发平台
  • 易企秀网站怎么做轮播图网站建设张世勇