サービスを列挙 <TOP>
サービス(参照:http://yougo.ascii24.com/gh/13/001302.html)を列挙します。WindowsNT3.1以降
OpenSCManager サービスマネージャの指定されたデータベースを開く
EnumServicesStatus サービスを列挙
CloseServiceHandle サービスのハンドルを閉じる
lstrcpy 文字列をコピーする

コントロールパネル → 管理ツール → サービス で確認しています。

'================================================================ '= サービスを列挙 '= WindowsNT3.1以降
'= (OpenSCManager2.bas)
'================================================================
#include "Windows.bi"
#define ERROR_MORE_DATA 234
#define SERVICE_ACTIVE &H1 'Active状態のサービスを列挙
#define SERVICE_INACTIVE &H2 'SERVICE_STOPPED状態のサービスを列挙
#define SC_MANAGER_ENUMERATE_SERVICE &H4'SCMデータベースにインストールされているサービスを列挙するために必要なEnumServicesStatus(Ex)の呼び出しを有効にする
#define SERVICE_WIN32_OWN_PROCESS &H10 '単体で動作するサービス
#define SERVICE_WIN32_SHARE_PROCESS &H20'他のサービスと伴に動作するサービス
#define SERVICE_WIN32 (&H10 Or &H20) '(SERVICE_WIN32_OWN_PROCESS Or SERVICE_WIN32_SHARE_PROCESS)
#define vbNullString ByVal 0 '値0の文字列。値0を持つ文字列。空文字列ではない
Type SERVICE_STATUS
dwServiceType As Long
dwCurrentState As Long
dwControlsAccepted As Long
dwWin32ExitCode As Long
dwServiceSpecificExitCode As Long
dwCheckPoint As Long
dwWaitHint As Long
End Type
Type ENUM_SERVICE_STATUS
lpServiceName As Long
lpDisplayName As Long
ServiceStatus As SERVICE_STATUS
End Type
' 指定されたコンピュータ上のサービス制御マネージャとの接続を確立し、サービス制御マネージャの指定されたデータベースを開く
Declare Function Api_OpenSCManager& Lib "advapi32" Alias "OpenSCManagerA" (ByVal lpMachineName$, ByVal lpDatabaseName$, ByVal dwDesiredAccess&)
' サービス制御マネージャ(Service Control Manager:SCM)の指定されたデータベース内のサービスを列挙
Declare Function Api_EnumServicesStatus& Lib "advapi32" Alias "EnumServicesStatusA" (ByVal hSCManager&, ByVal dwServiceType&, ByVal dwServiceState&, lpServices As Any, ByVal cbBufSize&, pcbbNeeded&, lpReturned&, lpResumeHandle&)
' サービスコントロールマネージャオブジェクトまたはサービスオブジェクトへの指定されたハンドルを閉じる
Declare Function Api_CloseServiceHandle& Lib "advapi32" Alias "CloseServiceHandle" (ByVal hSCObject&)
' 文字列をコピーする
Declare Function Api_lstrcpy& Lib "kernel32" Alias "lstrcpyA" (ByVal szDest$, ByVal szcSource&)
Var Shared List1 As Object
List1.Attach GetDlgItem("List1") : List1.SetFontSize 12
'================================================================
'= Chr$(0)を取り除く
'================================================================
Declare Function TrimNull(sInput As String) As String
Function TrimNull(sInput As String) As String
Var ZeroPos As Integer
ZeroPos = InStr(1, sInput, Chr$(0))
If ZeroPos > 0 Then
TrimNull = Left$(sInput, ZeroPos - 1)
Else
TrimNull = sInput
End If
End Function
'================================================================
'=
'================================================================
Declare Sub MainForm_Start edecl ()
Sub MainForm_Start()
Var hSCM As Long
Var ess(261) As ENUM_SERVICE_STATUS
Var InfoBuffer As Long
Var ServiceName As String * 250
Var ByteNeed As Long
Var ServiceRet As Long
Var NextUnreadEntry As Long
Var StructNeed As Long
Var Ret As Long
Var i As Long
Var txt As String
hSCM = Api_OpenSCManager(vbNullString, vbNullString, SC_MANAGER_ENUMERATE_SERVICE)
NextUnreadEntry = 0
Ret = Api_EnumServicesStatus(hSCM, SERVICE_WIN32, SERVICE_ACTIVE Or SERVICE_INACTIVE, ByVal 0, 0, ByteNeed, ServiceRet, NextUnreadEntry)
StructNeed = ByteNeed / Len(ess(0)) + 1
InfoBuffer = StructNeed * Len(ess(0))
NextUnreadEntry = 0
Ret = Api_EnumServicesStatus(hSCM, SERVICE_WIN32, SERVICE_ACTIVE Or SERVICE_INACTIVE, ess(0), InfoBuffer, ByteNeed, ServiceRet, NextUnreadEntry)
List1.Resetcontent
List1.AddString "All registered services:"
List1.AddString "------------------------"
For i = 0 To ServiceRet - 1
Ret = Api_lstrcpy(ServiceName, ess(i).lpServiceName)
txt = TrimNull(ServiceName) & " - "
Ret = Api_lstrcpy(ServiceName, ess(i).lpDisplayName)
txt = txt & TrimNull(ServiceName)
List1.AddString txt
Next i
Ret = Api_CloseServiceHandle(hSCM)
End Sub
'================================================================
'=
'================================================================
While 1
WaitEvent
Wend
Stop
End