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

解决方案 »

  1.   

    private command1_click()
    dim tmpstr as string
    shell "C:\winnt\system32\cmd.exe /c net start>C:\services.list",vbhidedo until dir("C:\services.list")<>""
       open "C:\services.list" for input as #1
            do while not eof(1)
               line input #1,tmpstr
               if trim(tmpstr)<>"" then
                  list1.additem tmpstr
               end if
            loop
            kill "C:\services.list"
       close #1
       doevents
    loop
    end subprivate list1_click()
       if list1.listindex<>-1 then
          shell "net stop " & list1.list(list1.listindex) ,hide
       end if
    end sub
      

  2.   

    也就是用
    net start命令获取已启动服务列表,并写入文本文件,然后读出来。再用
    net start service name来启动或 net stop停止服务。
      

  3.   

    openscm ,openservice API
      

  4.   

    下面这个例子可以正常运行。
    nik,你贴一下OpenService的例子,这个我不会。:)Private Sub Command1_Click()
    Dim tmpstr As String
    List1.Clear
    Shell "C:\winnt\system32\cmd.exe /c net start>C:\services.list", vbHideDo
       If Dir("C:\services.list") <> "" Then Exit Do
       DoEvents
    LoopOpen "C:\services.list" For Input As #1
         Do While Not EOF(1)
            Line Input #1, tmpstr
            If Trim(tmpstr) <> "" Then
               List1.AddItem Trim(tmpstr)
            End If
         Loop
    Close #1If List1.ListCount > 2 Then
       List1.RemoveItem 0
       List1.RemoveItem List1.ListCount - 1
    End If
    Do Until Dir("C:\services.list") = ""
       On Error Resume Next
       Kill "C:\services.list"
       DoEvents
    Loop
    End SubPrivate Sub List1_DBlClick()
       If List1.ListIndex <> -1 Then
          If MsgBox("Stop Service: " & List1.List(List1.ListIndex) & " ?", vbQuestion + vbYesNo, "Question") = vbYes Then
             Shell "net stop """ & List1.List(List1.ListIndex) & """", vbHide
          End If
       End If
    End Sub
      

  5.   

    同意 nik_Amis(Azrael) ,用api得的列表比较全:先在模块里声明:
    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