Warning: WP_Syntax::substituteToken(): Argument #1 ($match) must be passed by reference, value given in /www/wwwroot/fawdlstty.com/wp-content/plugins/wp-syntax/wp-syntax.php on line 383
服务控制在win32用户层系统编程中比较重要,一般用于创建自启动项或加载驱动,这样的话启动服务就是载入驱动,停止服务就是卸载驱动,极大方便了驱动控制。下面贴一个服务控制代码,可用于方便的控制服务。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | #pragma once #ifndef __HSERVER_HPP__ #define __HSERVER_HPP__ #include <Windows.h> class hService { SC_HANDLE h_scm = NULL, h_service = NULL; QUERY_SERVICE_CONFIG *h_qsc = NULL; SERVICE_STATUS h_status; public: hService (LPCTSTR serv_name) { h_qsc = (LPQUERY_SERVICE_CONFIG)new BYTE [8 * 1024]; if ((h_scm = ::OpenSCManager (NULL, NULL, SC_MANAGER_ALL_ACCESS)) && serv_name && serv_name[0]) { h_service = ::OpenService (h_scm, serv_name, SERVICE_ALL_ACCESS); } } ~hService () { delete h_qsc; if (h_service) ::CloseServiceHandle (h_service); if (h_scm) ::CloseServiceHandle (h_scm); } //服务是否正在运行 BOOL is_running () { if (!h_service) return FALSE; if (::QueryServiceStatus (h_service, &h_status)) { if (h_status.dwCurrentState == SERVICE_RUNNING) return TRUE; } return FALSE; } //服务是否已停止 BOOL is_stopped () { if (!h_service) return FALSE; if (::QueryServiceStatus (h_service, &h_status)) { if (h_status.dwCurrentState == SERVICE_STOPPED) return TRUE; } return FALSE; } //服务是否已暂停 BOOL is_pause () { if (!h_service) return FALSE; if (::QueryServiceStatus (h_service, &h_status)) { if (h_status.dwCurrentState == SERVICE_PAUSED) return TRUE; } return FALSE; } //服务是否自动启动 BOOL is_auto_run () { DWORD d; if (!h_service) return FALSE; if (::QueryServiceConfig (h_service, h_qsc, 8 * 1024, &d)) { return h_qsc->dwStartType <= 2; } return FALSE; } //启动服务 BOOL start () { if (!h_service) return FALSE; if (is_running ()) return TRUE; return ::StartService (h_service, NULL, NULL); } //停止服务 BOOL stop () { if (!h_service) return FALSE; if (is_stopped ()) return TRUE; return ::ControlService (h_service, SERVICE_CONTROL_STOP, &h_status); } //暂停服务 BOOL pause () { if (!h_service) return FALSE; if (is_running ()) return ::ControlService (h_service, SERVICE_CONTROL_PAUSE, &h_status); return TRUE; } //恢复服务 BOOL resume () { if (!h_service) return FALSE; if (is_pause ()) return ::ControlService (h_service, SERVICE_CONTROL_CONTINUE, &h_status); return is_running (); } //设置自动启动服务 BOOL auto_start () { if (!h_service) return FALSE; if (is_auto_run ()) return TRUE; SC_LOCK sclLock = ::LockServiceDatabase (h_scm); BOOL bRet = ::ChangeServiceConfig (h_service, SERVICE_NO_CHANGE, SERVICE_AUTO_START, SERVICE_NO_CHANGE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); if (sclLock) ::UnlockServiceDatabase (sclLock); return bRet; } //设置手动启动服务 BOOL demand_start () { if (!h_service) return FALSE; if (!is_auto_run ()) return TRUE; SC_LOCK sclLock = ::LockServiceDatabase (h_scm); BOOL bRet = ::ChangeServiceConfig (h_service, SERVICE_NO_CHANGE, SERVICE_DEMAND_START, SERVICE_NO_CHANGE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); if (sclLock) ::UnlockServiceDatabase (sclLock); return bRet; } //创建服务 static hService *create_service (LPCTSTR serv_name, LPCTSTR display_name, DWORD service_type, LPCTSTR path) { hService *service = new hService (NULL); service->h_service = ::CreateService (service->h_scm, serv_name, display_name, SC_MANAGER_ALL_ACCESS, service_type, SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE, path, NULL, NULL, NULL, NULL, NULL); return service; } //删除服务 BOOL delete_service () { if (::DeleteService (h_service)) { h_service = NULL; return TRUE; } return FALSE; } }; #endif //__HSERVER_HPP__ |
创建头文件,引入以上代码之后,就可以方便进行服务控制了。调用方式在代码中已有注释。