SERVICE_STATUS
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 | ||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| dwServiceType | ENUM_SERVICE_TYPE | 4 | +0 | +0 | サービスの種類です。このメンバーには、次のいずれかの値を指定できます。
サービスの種類が SERVICE_WIN32_OWN_PROCESS または SERVICE_WIN32_SHARE_PROCESS であり、サービスが LocalSystem アカウント のコンテキストで実行されている場合は、次の種類も指定できます。
| ||||||||||||||||||||||||||||
| dwCurrentState | SERVICE_STATUS_CURRENT_STATE | 4 | +4 | +4 | サービスの現在の状態です。このメンバーには、次のいずれかの値を指定できます。
| ||||||||||||||||||||||||||||
| dwControlsAccepted | DWORD | 4 | +8 | +8 | サービスがハンドラー関数で受け付けて処理する制御コードです( Handler および HandlerEx を参照してください)。ユーザーインターフェイスのプロセスは、 ControlService 関数または ControlServiceEx 関数で制御コマンドを指定して、サービスを制御できます。既定では、すべてのサービスが SERVICE_CONTROL_INTERROGATE 値を受け付けます。 SERVICE_CONTROL_DEVICEEVENT 値を受け付けるには、サービスは RegisterDeviceNotification 関数を使用して、デバイスイベントを受け取るように登録しなければなりません。 制御コードは次のとおりです。
このメンバーには、次の拡張制御コードを含めることもできます。これらは HandlerEx でのみサポートされます。(なお、これらの制御コードは ControlService や ControlServiceEx では送信できません。)
| ||||||||||||||||||||||||||||
| dwWin32ExitCode | DWORD | 4 | +12 | +12 | サービスの開始時または停止時に発生したエラーを報告するために、サービスが使用するエラーコードです。サービス固有のエラーコードを返すには、サービスはこの値を ERROR_SERVICE_SPECIFIC_ERROR に設定し、dwServiceSpecificExitCode メンバーにエラーコードが格納されていることを示さなければなりません。実行中および正常終了時には、サービスはこの値を NO_ERROR に設定します。 | ||||||||||||||||||||||||||||
| dwServiceSpecificExitCode | DWORD | 4 | +16 | +16 | サービスの開始中または停止中にエラーが発生した場合に、サービスが返すサービス固有のエラーコードです。この値は、dwWin32ExitCode メンバーが ERROR_SERVICE_SPECIFIC_ERROR に設定されている場合を除き、無視されます。 | ||||||||||||||||||||||||||||
| dwCheckPoint | DWORD | 4 | +20 | +20 | 開始、停止、一時停止、再開といった時間のかかる操作の進行状況を報告するために、サービスが定期的に増やすチェックポイント値です。たとえば、サービスは起動時に初期化の各ステップが完了するたびに、この値を増やします。サービスに対して操作を実行したユーザーインターフェイスのプログラムは、時間のかかる操作の進行状況を追跡するために、この値を使用します。サービスに開始、停止、一時停止、再開のいずれの操作も保留されていない場合、この値は無効であり、0 でなければなりません。 | ||||||||||||||||||||||||||||
| dwWaitHint | DWORD | 4 | +24 | +24 | 保留中の開始、停止、一時停止、再開の各操作に必要と見込まれる時間(ミリ秒単位)です。指定された時間が経過する前に、サービスは dwCheckPoint の値を増やすか dwCurrentState を変更したうえで、次の SetServiceStatus 関数の呼び出しを行う必要があります。dwWaitHint で指定された時間が経過しても dwCheckPoint が増えず、dwCurrentState も変化していない場合、サービス制御マネージャーまたはサービス制御プログラムは、エラーが発生したと見なしてサービスを停止できます。ただし、サービスが他のサービスとプロセスを共有している場合は、そのプロセスを共有する他のサービスも終了させることになるため、サービス制御マネージャーはサービスアプリケーションを終了できません。 |
公式ドキュメント
サービスのステータス情報を格納します。 ControlService、 EnumDependentServices、 EnumServicesStatus、 QueryServiceStatus の各関数は、この構造体を使用します。サービスは SetServiceStatus 関数でこの構造体を使用して、現在のステータスをサービス制御マネージャーに報告します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// SERVICE_STATUS (x64 28 / x86 28 バイト)
typedef struct SERVICE_STATUS {
ENUM_SERVICE_TYPE dwServiceType;
SERVICE_STATUS_CURRENT_STATE dwCurrentState;
DWORD dwControlsAccepted;
DWORD dwWin32ExitCode;
DWORD dwServiceSpecificExitCode;
DWORD dwCheckPoint;
DWORD dwWaitHint;
} SERVICE_STATUS;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SERVICE_STATUS
{
public uint dwServiceType;
public uint dwCurrentState;
public uint dwControlsAccepted;
public uint dwWin32ExitCode;
public uint dwServiceSpecificExitCode;
public uint dwCheckPoint;
public uint dwWaitHint;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure SERVICE_STATUS
Public dwServiceType As UInteger
Public dwCurrentState As UInteger
Public dwControlsAccepted As UInteger
Public dwWin32ExitCode As UInteger
Public dwServiceSpecificExitCode As UInteger
Public dwCheckPoint As UInteger
Public dwWaitHint As UInteger
End Structureimport ctypes
from ctypes import wintypes
class SERVICE_STATUS(ctypes.Structure):
_fields_ = [
("dwServiceType", wintypes.DWORD),
("dwCurrentState", wintypes.DWORD),
("dwControlsAccepted", wintypes.DWORD),
("dwWin32ExitCode", wintypes.DWORD),
("dwServiceSpecificExitCode", wintypes.DWORD),
("dwCheckPoint", wintypes.DWORD),
("dwWaitHint", wintypes.DWORD),
]#[repr(C)]
pub struct SERVICE_STATUS {
pub dwServiceType: u32,
pub dwCurrentState: u32,
pub dwControlsAccepted: u32,
pub dwWin32ExitCode: u32,
pub dwServiceSpecificExitCode: u32,
pub dwCheckPoint: u32,
pub dwWaitHint: u32,
}import "golang.org/x/sys/windows"
type SERVICE_STATUS struct {
dwServiceType uint32
dwCurrentState uint32
dwControlsAccepted uint32
dwWin32ExitCode uint32
dwServiceSpecificExitCode uint32
dwCheckPoint uint32
dwWaitHint uint32
}type
SERVICE_STATUS = record
dwServiceType: DWORD;
dwCurrentState: DWORD;
dwControlsAccepted: DWORD;
dwWin32ExitCode: DWORD;
dwServiceSpecificExitCode: DWORD;
dwCheckPoint: DWORD;
dwWaitHint: DWORD;
end;const SERVICE_STATUS = extern struct {
dwServiceType: u32,
dwCurrentState: u32,
dwControlsAccepted: u32,
dwWin32ExitCode: u32,
dwServiceSpecificExitCode: u32,
dwCheckPoint: u32,
dwWaitHint: u32,
};type
SERVICE_STATUS {.bycopy.} = object
dwServiceType: uint32
dwCurrentState: uint32
dwControlsAccepted: uint32
dwWin32ExitCode: uint32
dwServiceSpecificExitCode: uint32
dwCheckPoint: uint32
dwWaitHint: uint32struct SERVICE_STATUS
{
uint dwServiceType;
uint dwCurrentState;
uint dwControlsAccepted;
uint dwWin32ExitCode;
uint dwServiceSpecificExitCode;
uint dwCheckPoint;
uint dwWaitHint;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; SERVICE_STATUS サイズ: 28 バイト(x64)
dim st, 7 ; 4byte整数×7(構造体サイズ 28 / 4 切り上げ)
; dwServiceType : ENUM_SERVICE_TYPE (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; dwCurrentState : SERVICE_STATUS_CURRENT_STATE (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; dwControlsAccepted : DWORD (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; dwWin32ExitCode : DWORD (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; dwServiceSpecificExitCode : DWORD (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; dwCheckPoint : DWORD (+20, 4byte) st.5 = 値 / 値 = st.5 (lpoke/lpeek も可)
; dwWaitHint : DWORD (+24, 4byte) st.6 = 値 / 値 = st.6 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global SERVICE_STATUS
#field int dwServiceType
#field int dwCurrentState
#field int dwControlsAccepted
#field int dwWin32ExitCode
#field int dwServiceSpecificExitCode
#field int dwCheckPoint
#field int dwWaitHint
#endstruct
stdim st, SERVICE_STATUS ; NSTRUCT 変数を確保
st->dwServiceType = 100
mes "dwServiceType=" + st->dwServiceType