WIn32API Windowsサービスの状態を取得する QueryServiceStatus
Windowsサービスの状態を取得するには、QueryServiceStatus関数を用いる。
QueryServiceStatus関数のプロトタイプは以下のとおり
BOOL QueryServiceStatus( SC_HANDLE hService, // サービスのハンドル LPSERVICE_STATUS lpServiceStatus // サービスのステータス );
QueryServiceStatus関数の第二引数の型であるSERVICE_STATUS構造体は、WinSvc.h にて以下のように宣言されている。
typedef struct _SERVICE_STATUS { DWORD dwServiceType; DWORD dwCurrentState; DWORD dwControlsAccepted; DWORD dwWin32ExitCode; DWORD dwServiceSpecificExitCode; DWORD dwCheckPoint; DWORD dwWaitHint; } SERVICE_STATUS, *LPSERVICE_STATUS;
特に主要な構造体メンバは、dwCurrentState、dwServiceTypeである。
dwCurrentStateは、現在のサービスの状態を表すDWORD型変数で、以下の値を取りうる
dwCurrentState | 説明 |
SERVICE_STOPPED | サービスが停止している |
SERVICE_START_PENDING | サービスの開始が保留されている |
SERVICE_STOP_PENDING | サービスの停止が保留されている |
SERVICE_RUNNING | サービスは実行されている |
SERVICE_CONTINUE_PENDING | サービスの続行が保留されている |
SERVICE_PAUSE_PENDING | サービスの一時停止が保留されている |
SERVICE_PAUSED | サービスが一時停止されている |
dwServiceTypeは、サービスタイプを表し、以下の値を取りうる
dwServiceType | 説明 |
SERVICE_FILE_SYSTEM_DRIVER | サービスはファイルシステムドライバー |
SERVICE_KERNEL_DRIVER | サービスはデバイスドライバー |
SERVICE_WIN32_OWN_PROCESS | サービスはその独自のプロセスで実行している |
SERVICE_WIN32_SHARE_PROCESS | サービスは他のサービスと1つのプロセスを共有している |
SERVICE_INTERACTIVE_PROCESS | サービスはデスクトップと対話可能である |
#include <windows.h> #include <stdio.h> void PrintCurrentStatus(DWORD dwCurrentState) { switch (dwCurrentState) { case SERVICE_STOPPED: puts("SERVICE_STOPPED"); break; case SERVICE_START_PENDING: puts("SERVICE_START_PENDING"); break; case SERVICE_STOP_PENDING: puts("SERVICE_STOP_PENDING"); break; case SERVICE_RUNNING: puts("SERVICE_RUNNING"); break; case SERVICE_CONTINUE_PENDING: puts("SERVICE_CONTINUE_PENDING"); break; case SERVICE_PAUSE_PENDING: puts("SERVICE_PAUSE_PENDING"); break; case SERVICE_PAUSED: puts("SERVICE_PAUSED"); break; default: puts("Unkown State"); break; } } void PrintServiceType(DWORD dwServiceType) { switch (dwServiceType) { case SERVICE_FILE_SYSTEM_DRIVER: puts("SERVICE_FILE_SYSTEM_DRIVER"); break; case SERVICE_KERNEL_DRIVER: puts("SERVICE_KERNEL_DRIVER"); break; case SERVICE_WIN32_OWN_PROCESS: puts("SERVICE_WIN32_OWN_PROCESS"); break; case SERVICE_WIN32_SHARE_PROCESS: puts("SERVICE_WIN32_SHARE_PROCESS"); break; case SERVICE_INTERACTIVE_PROCESS: puts("SERVICE_INTERACTIVE_PROCESS"); break; default: puts("Unknown service type"); break; } } int main() { SC_HANDLE hSCM; SC_HANDLE hService; SERVICE_STATUS ServiceStatus; LPCTSTR lpszServiceName = TEXT("Dhcp"); hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT); if (hSCM == NULL) { return 1; } hService = OpenService(hSCM, lpszServiceName, SERVICE_QUERY_STATUS); if (hService == NULL) { return 1;//goto } //サービスの状態を取得する if (QueryServiceStatus(hService, &ServiceStatus)) { PrintCurrentStatus(ServiceStatus.dwCurrentState); PrintServiceType(ServiceStatus.dwServiceType); } else { printf("QueryServiceStatus error: %d\n", GetLastError()); } CloseServiceHandle(hService); CloseServiceHandle(hSCM); return 0; }
SERVICE_RUNNING SERVICE_WIN32_SHARE_PROCESS
http://msdn.microsoft.com/ja-jp/library/cc429299.aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms685996(v=vs.85).aspx