各位大虾:
    小弟在座一个安装程序,希望可以把已有的服务停止,但是我不知道
如何得到 服务列表,以便搜索服务,并根据他们的状态去停止 或重新启动他们希望大家帮忙啊 十万火急 最后有实例

解决方案 »

  1.   

    shell "C:\winnt\system32\cmd.exe /c net start>C:\services.txt",vbhide
      

  2.   

    用下列API函数
    打开服务管理器
    SC_HANDLE OpenSCManager(
      LPCTSTR lpMachineName,  // pointer to machine name string
      LPCTSTR lpDatabaseName,  // pointer to database name string
      DWORD dwDesiredAccess   // type of access
    );
    打开一个服务
    SC_HANDLE OpenService(
      SC_HANDLE hSCManager,  // handle to service control manager 
                             // database
      LPCTSTR lpServiceName, // pointer to name of service to start
      DWORD dwDesiredAccess  // type of access to service
    );
    关闭服务或管理器的句柄
    BOOL CloseServiceHandle(
      SC_HANDLE hSCObject   // handle to service or service control 
                            // manager database
    );
    设置服务的状态包括运行,停止,暂停等
    BOOL SetServiceStatus(
      SERVICE_STATUS_HANDLE hServiceStatus~,
                                         // service status handle
      LPSERVICE_STATUS lpServiceStatus   // address of status structure
    );http://expert.csdn.net/Expert/TopicView1.asp?id=2004319
    详细内容看msdn
      

  3.   

    Public Const ERROR_MORE_DATA = 234
    Public Const SERVICE_ACTIVE = &H1
    Public Const SERVICE_INACTIVE = &H2
    Public Const SC_MANAGER_ENUMERATE_SERVICE = &H4
    Public Const SERVICE_WIN32_OWN_PROCESS As Long = &H10
    Public Const SERVICE_WIN32_SHARE_PROCESS As Long = &H20
    Public Const SERVICE_WIN32 As Long = SERVICE_WIN32_OWN_PROCESS + SERVICE_WIN32_SHARE_PROCESS
    Public 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
    Public Type ENUM_SERVICE_STATUS
        lpServiceName As Long
        lpDisplayName As Long
        ServiceStatus As SERVICE_STATUS
    End Type
    Public Declare Function OpenSCManager Lib "advapi32.dll" Alias "OpenSCManagerA" (ByVal lpMachineName As String, ByVal lpDatabaseName As String, ByVal dwDesiredAccess As Long) As Long
    Public 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
    Public Declare Function CloseServiceHandle Lib "advapi32.dll" (ByVal hSCObject As Long) As Long
    Public Declare Function lstrcpy Lib "kernel32.dll" Alias "lstrcpyA" (szDest As String, szcSource As Long) As Long
    Public 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在窗体里代码(窗体内置一list1控件):
    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.
        'Me.AutoRedraw = True
        'Me.Print "All registered services:" + vbCrLf
       Dim name1 As String
        
        For i = 0 To lngServicesReturned - 1
            lngResult = lstrcpy(ByVal strServiceName, ByVal lpEnumServiceStatus(i).lpServiceName)
            name1 = StripTerminator(strServiceName)
            
            lngResult = lstrcpy(ByVal strServiceName, ByVal lpEnumServiceStatus(i).lpDisplayName)
            List1.AddItem "服务名:" + name1 + "  显示名: " + StripTerminator(strServiceName)
            
            
        Next i
        'Clean up.
        CloseServiceHandle (hSCM)
    End Sub自已判断状态(currentstate)后,用下面的api来启动服务:
    Public Declare Function OpenService Lib "advapi32.dll" Alias "OpenServiceA" (ByVal hSCManager As Long, ByVal lpServiceName As String, ByVal dwDesiredAccess As Long) As Long
      

  4.   

    打开一个服务
    SC_HANDLE OpenService(
      SC_HANDLE hSCManager,  // handle to service control manager 
                             // database
      LPCTSTR lpServiceName, // pointer to name of service to start
      DWORD dwDesiredAccess  // type of access to service