2011-09-10 37 views
0

I',嘗試創建服務並根據我的需要更改其配置。創建不是問題,但是當我想更改服務設置時,它會失敗。我想創建交互式服務。這裏是我的代碼:
無法更改服務配置

Public Function setInteractiveOption() As Boolean 
    Dim hSCManager As Long 
    Dim hService As Long 
    hSCManager = OpenSCManager(vbNullString, vbNullString, SC_MANAGER_ALL_ACCESS) 

    hService = OpenService(hSCManager, SERVICE_NAME, SERVICE_CHANGE_CONFIG) 

    Dim result As Long 
    result = ChangeServiceConfig(hService, SERVICE_WIN32_OWN_PROCESS Or SERVICE_INTERACTIVE_PROCESS, SERVICE_NO_CHANGE, SERVICE_NO_CHANGE, vbNull, vbNull, vbNull, vbNull, vbNull, vbNull, vbNull) 


    CloseServiceHandle hService 

    If result Then 
     setInteractiveOption = True 
    Else 
     setInteractiveOption = False 
    End If 

End Function 

它給我的錯誤代碼1057 - 帳戶名無效或者不存在,或者密碼對於指定的帳戶名無效。

編輯:這裏是我的API delaration:

Public Declare Function ChangeServiceConfig Lib "advapi32.dll" Alias _ 
     "ChangeServiceConfigA" (ByVal hService As Long, ByVal dwServiceType _ 
     As Long, ByVal dwStartType As Long, ByVal dwErrorControl As Long, ByVal _ 
     lpBinaryPathName As String, ByVal lpLoadOrderGroup As String, lpdwTagId _ 
     As Long, ByVal lpDependencies As String, ByVal lpServiceStartName As String, _ 
     ByVal lpPassword As String, ByVal lpDisplayName As String) As Long 

     Private Declare Function OpenService _ 
     Lib "advapi32" Alias "OpenServiceA" _ 
     (ByVal hSCManager As Long, ByVal lpServiceName As String, _ 
     ByVal dwDesiredAccess As Long) As Long 

     Private Declare Function OpenSCManager _ 
     Lib "advapi32" Alias "OpenSCManagerA" _ 
     (ByVal lpMachineName As String, ByVal lpDatabaseName As String, _ 
     ByVal dwDesiredAccess As Long) As Long 

Public Const SERVICE_NO_CHANGE = &HFFFFM

您可以下載我的項目的代碼在這裏(我從網上下載的互聯網原單源):
http://www.mediafire.com/?138esmdw5tvt19q

我測試了這個程序米在XP(和失敗),但在Windows 7中它似乎很奇怪:我沒有註冊服務,但改變其配置是成功的!

+1

發佈您的API聲明 – wqw

+0

@wqw我發佈了API delarations,但我不認爲他們是問題。我從API瀏覽器複製他們 – undone

+1

你知道'vbNull'比'vbNullString'很大的不同? – wqw

回答

1

如果錯誤消息是抱怨該帳戶,然後從那裏開始。您將帳戶參數聲明爲字符串:

... ,ByVal lpServiceStartName As String, ByVal lpPassword As String 

因此您需要使用vbNullString作爲要傳遞的值。

可替代地,只要重新定義thjem:

..., ByVal lpServiceStartName As Long, ByVal lpPassword As Long 

然後傳遞0 &作爲值。

EDIT1:

我改變

Public Const SERVICE_NO_CHANGE = &HFFFF 

Public Const SERVICE_NO_CHANGE = &HFFFFFFFF 

,並引用一個已經安裝在我自己的服務,我叫setInteractiveOption,它是成功的XP專業版。我確定該服務的帳戶設置爲LocalSystem,如MSDN中所示。

EDIT2:

這裏是decalre(你也必須使用來自EDIT1的常數)

Public Declare Function ChangeServiceConfig Lib "advapi32.dll" _ 
Alias "ChangeServiceConfigA" (_ 
    ByVal hService As Long, _ 
    ByVal dwServiceType As Long, _ 
    ByVal dwStartType As Long, _ 
    ByVal dwErrorControl As Long, _ 
    ByVal lpBinaryPathName As String, _ 
    ByVal lpLoadOrderGroup As String, _ 
    ByVal lpdwTagId As String, _ 
    ByVal lpDependencies As String, _ 
    ByVal lpServiceStartName As String, _ 
    ByVal lpPassword As String, _ 
    ByVal lpDisplayName As String) As Long 

這裏是你的方法:

Public Function setInteractiveOption() As Boolean 
    Dim hSCManager As Long 
    Dim hService As Long 
    hSCManager = OpenSCManager(vbNullString, vbNullString, SC_MANAGER_ALL_ACCESS) 
    MsgBox "hSCManager: " & hSCManager 
    hService = OpenService(hSCManager, SERVICE_NAME, SERVICE_CHANGE_CONFIG) 
    MsgBox "hService: " & hService 
    Dim result As Long 

    result = ChangeServiceConfig(hService, _ 
           SERVICE_WIN32_OWN_PROCESS Or SERVICE_INTERACTIVE_PROCESS, _ 
           SERVICE_NO_CHANGE, _ 
           SERVICE_NO_CHANGE, _ 
           vbNullString, _ 
           vbNullString, _ 
           vbNullString, _ 
           vbNullString, _ 
           vbNullString, _ 
           vbNullString, _ 
           vbNullString) 

    MsgBox "result: " & result & vbNewLine & "Error: " & Err.LastDllError 

    CloseServiceHandle hService 

    If result Then 
     setInteractiveOption = True 
    Else 
     setInteractiveOption = False 
    End If 

End Function 

我加入一個按鈕只需調用這個方法到你的表單,它就很好。

+0

沒有幫助。我說我的源代碼,這樣你就可以下載並檢查它! – undone

+0

我給它一個嘗試。雖然你上面編輯的代碼沒有做什麼,我建議。 – tcarvin

+0

沒關係,我看到你發佈的鏈接,而不是編輯的源泉! – tcarvin