小弟想写一个win200下的服务管理程序。
现已经实现了。增加,删除服务。可是枚举系统服务这里找不到资料。希望大家给点资料。代码。参考一下
拜谢!!

解决方案 »

  1.   

    窗体上一个listbox:
    Option Explicit
    Const ERROR_MORE_DATA = 234
    Const SERVICE_ACTIVE = &H1
    Const SERVICE_INACTIVE = &H2
    Const SC_MANAGER_ENUMERATE_SERVICE = &H4
    Const SERVICE_WIN32_OWN_PROCESS As Long = &H10
    Const SERVICE_WIN32_SHARE_PROCESS As Long = &H20
    Const SERVICE_WIN32 As Long = SERVICE_WIN32_OWN_PROCESS + SERVICE_WIN32_SHARE_PROCESS
    Private 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
    Private Type ENUM_SERVICE_STATUS
        lpServiceName As Long
        lpDisplayName As Long
        ServiceStatus As SERVICE_STATUS
    End Type
    Private Declare Function OpenSCManager Lib "advapi32.dll" Alias "OpenSCManagerA" (ByVal lpMachineName As String, ByVal lpDatabaseName As String, ByVal dwDesiredAccess As Long) As Long
    Private Declare Function EnumServicesStatus Lib "advapi32.dll" Alias "EnumServicesStatusA" (ByVal hSCManager As Long, ByVal dwServiceType As Long, ByVal dwServiceState As Long, lpServices As Any, ByVal cbBufSize As Long, pcbBytesNeeded As Long, lpServicesReturned As Long, lpResumeHandle As Long) As Long
    Private Declare Function CloseServiceHandle Lib "advapi32.dll" (ByVal hSCObject As Long) As Long
    Private Declare Function lstrcpy Lib "kernel32.dll" Alias "lstrcpyA" (szDest As String, szcSource As Long) As Long
    Private Sub Form_Load()
        Dim hSCM As Long, lpEnumServiceStatus() As ENUM_SERVICE_STATUS, lngServiceStatusInfoBuffer As Long
        Dim strServiceName As String * 250, lngBytesNeeded As Long, lngServicesReturned As Long
        Dim hNextUnreadEntry As Long, lngStructsNeeded As Long, lngResult As Long, i As Long
        'Open connection to Service Control Manager.
        hSCM = OpenSCManager(vbNullString, vbNullString, SC_MANAGER_ENUMERATE_SERVICE)
        If hSCM = 0 Then
            MsgBox "OpenSCManager failed. LastDllError = " & CStr(Err.LastDllError)
            Exit Sub
        End If
        'Get buffer size (bytes) without passing a buffer
        'and make sure starts at 0th entry.
        hNextUnreadEntry = 0
        lngResult = EnumServicesStatus(hSCM, SERVICE_WIN32, SERVICE_ACTIVE Or SERVICE_INACTIVE, ByVal &H0, &H0, lngBytesNeeded, lngServicesReturned, hNextUnreadEntry)
        'We should receive MORE_DATA error.
        If Not Err.LastDllError = ERROR_MORE_DATA Then
            MsgBox "LastDLLError = " & CStr(Err.LastDllError)
            Exit Sub
        End If
        'Calculate the number of structures needed.
        lngStructsNeeded = lngBytesNeeded / Len(lpEnumServiceStatus(0)) + 1
        'Redimension the array according to our calculation.
        ReDim lpEnumServiceStatus(lngStructsNeeded - 1)
        'Get buffer size in bytes.
        lngServiceStatusInfoBuffer = lngStructsNeeded * Len(lpEnumServiceStatus(0))
        'Get services information starting entry 0.
        hNextUnreadEntry = 0
        lngResult = EnumServicesStatus(hSCM, SERVICE_WIN32, SERVICE_ACTIVE Or SERVICE_INACTIVE, lpEnumServiceStatus(0), lngServiceStatusInfoBuffer, lngBytesNeeded, lngServicesReturned, hNextUnreadEntry)
        If lngResult = 0 Then
            MsgBox "EnumServicesStatus failed. LastDllError = " & CStr(Err.LastDllError)
            Exit Sub
        End If
        'Get the strings and display them.
        List1.AddItem "全部注册的服务:"
        For i = 0 To lngServicesReturned - 1
            lngResult = lstrcpy(ByVal strServiceName, ByVal lpEnumServiceStatus(i).lpServiceName)
            
            lngResult = lstrcpy(ByVal strServiceName, ByVal lpEnumServiceStatus(i).lpDisplayName)
            List1.AddItem StripTerminator(strServiceName) + " - " + StripTerminator(strServiceName)
        Next i
        'Clean up.
        CloseServiceHandle (hSCM)
    End Sub
    Function StripTerminator(sInput As String) As String
        Dim ZeroPos As Integer
        ZeroPos = InStr(1, sInput, Chr$(0))
        If ZeroPos > 0 Then
            StripTerminator = Left$(sInput, ZeroPos - 1)
        Else
            StripTerminator = sInput
        End If
    End Function
      

  2.   

    rainstormmaster(暴风雨 v2.0) 大哥能不能把列出服务的说明。状态呢等等信息也列出来呢?
    我用的是listview控件
    要求显示跟系统那个服务管理程序显示的一样!!我留个QQ:389351