2013-06-29 158 views
3

試圖開發我的第一個Windows服務,並且我在Windows 7 MS VC++ 10.0中進行調試。只要它調用,StartServiceCtrlDispatcher(),我得到一個錯誤1063,它說,訪問被拒絕。我是管理員,我究竟該如何通過這個?我是新來的服務。謝謝。代碼:C++ Windows服務錯誤1063

// For WinXp, don't forget to link to 
// Advapi32.lib library if needed... 

#define _WIN32_WINNT 0x0501 

#include <windows.h> 

#include <stdio.h> 
#include <tchar.h> 

// Prototypes, just empty skeletons... 

void SvcDebugOut(LPSTR String, DWORD Status); 
void WINAPI MyServiceCtrlHandler(DWORD opcode); 
void MyServiceStart(DWORD argc, LPTSTR *argv); 
DWORD MyServiceInitialization(DWORD argc, LPTSTR *argv, DWORD *specificError); 

void main() 
{ 

     // Using 2-D array as a table... 

     // The name of a service to be run in this service process - "MyService", 

     // The function as the starting point for a service - MyServiceStart or 

     // a pointer to a ServiceMain() function... 

     // The members of the last entry in the table must have NULL values 

     // to designate the end of the table... 

     SERVICE_TABLE_ENTRY DispatchTable[] = {{_TEXT("MyService"), (LPSERVICE_MAIN_FUNCTION)MyServiceStart}, {NULL, NULL}}; 
    if (!StartServiceCtrlDispatcher(DispatchTable)) 
     SvcDebugOut("StartServiceCtrlDispatcher() failed, error: %d\n", GetLastError()); 
    else 
     printf("StartServiceCtrlDispatcher() looks OK.\n"); 
    return; 
} 

// ========================================================================== 
// Prototype definitions...just skeletons here... 
void WINAPI MyServiceCtrlHandler(DWORD opcode) 
{ 
     // Service control information here... 
     return; 
} 

void MyServiceStart(DWORD argc, LPTSTR *argv) 
{ 
     // Starting service information here... 
     return; 
} 



DWORD MyServiceInitialization(DWORD argc, LPTSTR *argv, DWORD *specificError) 
{ 
     // Service initialization information here... 
     return 0; 
} 

// Very simple info to the standard output... 
void SvcDebugOut(LPSTR String, DWORD Status) 
{ 
    CHAR Buffer[1024]; 
    printf("In SvcDebugOut() lol!\n"); 
    if (strlen(String) < 1000) 
    { 
     sprintf(Buffer, String, Status); 
     OutputDebugStringA(Buffer); 
    } 
    else 
     printf("String too long...\n"); 
    return; 
} 

回答

0

服務在其註冊屬性中指定的帳戶下運行。註冊服務或啓動服務可能不一樣。閱讀關於此。

許多服務在具有非常有限能力的「網絡服務」帳戶下運行。這很有意義,因爲許多服務處理來自網絡的請求。這就是爲什麼「網絡服務」被微軟選爲默認值。

0

This post answers correct。只要你沒有開始「作爲服務」的服務,它將無法正常工作。

您需要註冊它。要做到這一點,看看這個file,這是蘋果bonjour服務的實現,它是開源的。

它給出了安裝服務必須做什麼的一個好主意。特別是方法InstallService - 和RemoveService(如果你想刪除它)。