Here's the Registry method... for NT-based Windows only (tested only on XP):
Code: Select all
; -----------------------------------------------------------------------------
; TURN DEBUGGER ON TO SEE THE OUTPUT!!!
; -----------------------------------------------------------------------------
; Just call GetServiceList () and then iterate through the list (see
; demo at bottom of source)...
; -----------------------------------------------------------------------------
; Required list...
; -----------------------------------------------------------------------------
Structure ServiceList
displayname.s
description.s
EndStructure
Global NewList ServiceList.ServiceList ()
; -----------------------------------------------------------------------------
; Registry support functions...
; -----------------------------------------------------------------------------
Procedure OpenKey (openkey, subkey$, flags)
result = RegOpenKeyEx_ (openkey, subkey$, 0, flags, @handle)
If result = #ERROR_SUCCESS
ProcedureReturn handle
EndIf
EndProcedure
Procedure CloseKey (openkey)
ProcedureReturn RegCloseKey_ (openkey)
EndProcedure
Procedure.s GetStringValue (openkey, value$)
buffer$ = Space (1024)
size.l = 1024
res = RegQueryValueEx_ (openkey, @value$, #Null, @type, @buffer$, @size)
If res <> #ERROR_SUCCESS
buffer$ = ""
EndIf
ProcedureReturn buffer$
EndProcedure
Procedure GetIntValue (openkey, value$)
size = 4
RegQueryValueEx_ (openkey, @value$, #Null, @type, @res, @size)
ProcedureReturn res
EndProcedure
; -----------------------------------------------------------------------------
; Specific to listing services...
; -----------------------------------------------------------------------------
Procedure EnumServices (openkey)
buffsize = 256
buffer$ = Space (buffsize)
result = RegEnumKeyEx_ (openkey, index, @buffer$, @buffsize, #Null, #Null, #Null, @written.SYSTEMTIME)
index = index + 1
If result = #ERROR_SUCCESS
Repeat
buffsize = 256
buffer$ = Space (buffsize)
result = RegEnumKeyEx_ (openkey, index, @buffer$, @buffsize, #Null, #Null, #Null, @written.SYSTEMTIME)
If result = #ERROR_SUCCESS
key = OpenKey (openkey, buffer$, #KEY_ALL_ACCESS)
If key
servicetype = GetIntValue (key, "Type")
; Retrieve only those listed in Control Panel -> Admin Tools -> Services...
If servicetype > 8 ; See http://www.jsifaq.com/SF/Tips/Tip.aspx?id=0324
AddElement (ServiceList ())
dsp$ = GetStringValue (key, "DisplayName")
dsc$ = GetStringValue (key, "Description")
If dsp$ = ""
dsp$ = "Unknown service"
EndIf
If dsc$ = ""
dsc$ = "[No description]"
EndIf
ServiceList ()\displayname = dsp$
ServiceList ()\description = dsc$
EndIf
CloseKey (key)
EndIf
EndIf
index = index + 1
Until result = #ERROR_NO_MORE_ITEMS
EndIf
EndProcedure
; -----------------------------------------------------------------------------
; Easy wrapper function...
; -----------------------------------------------------------------------------
Procedure GetServiceList ()
ClearList (ServiceList ())
services = OpenKey (#HKEY_LOCAL_MACHINE, "SYSTEM\CurrentControlSet\Services", #KEY_ALL_ACCESS)
If services
EnumServices (services)
CloseKey (services)
EndIf
ResetList (ServiceList ())
EndProcedure
; -----------------------------------------------------------------------------
; D E M O . . .
; -----------------------------------------------------------------------------
GetServiceList ()
While NextElement (ServiceList ())
Debug ServiceList ()\displayname
Debug Chr (34) + ServiceList ()\description + Chr (34)
Debug ""
Wend