0

このようにインストールしようとすると、サービスに問題があります:

sc create MemoryStatus binpath= "C:\Users\rock\Documents\Visual Studio 2010\Projects\ServiceInC\Release\ServiceInC.exe"

cmdにサービスが正常にインストールされたというメッセージが表示されますが、タスクマネージャーで確認すると、常に停止状態になっています。もう1つは、サービスが開始されていないことです。ログメッセージが表示されないためです。

権限などに問題があるようですが、手伝ってもらえますか?

私の主なサービス機能は:

void ServiceMain(int argc, char** argv) 
{ 
    int error; 

    ServiceStatus.dwServiceType        = SERVICE_WIN32; 
    ServiceStatus.dwCurrentState       = SERVICE_START_PENDING; 
    ServiceStatus.dwControlsAccepted   = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
    ServiceStatus.dwWin32ExitCode      = 0; 
    ServiceStatus.dwServiceSpecificExitCode = 0; 
    ServiceStatus.dwCheckPoint         = 0; 
    ServiceStatus.dwWaitHint           = 0; 

    hStatus = RegisterServiceCtrlHandler(
        "MemoryStatus", 
        (LPHANDLER_FUNCTION)ControlHandler); 
    if (hStatus == (SERVICE_STATUS_HANDLE)0) 
    { 
        // Registering Control Handler failed
        WriteToLog("Registering Control Handler failed");
        return; 
    }  
    // Initialize Service 
    error = InitService(); 
    if (error) 
    {
        // Initialization failed
        WriteToLog("Initialization failed");
        ServiceStatus.dwCurrentState       = SERVICE_STOPPED; 
        ServiceStatus.dwWin32ExitCode      = -1; 
        SetServiceStatus(hStatus, &ServiceStatus); 
        return; 
    } 
    // We report the running status to SCM. 
    ServiceStatus.dwCurrentState = SERVICE_RUNNING; 
    SetServiceStatus (hStatus, &ServiceStatus);

    MEMORYSTATUS memory;
    // The worker loop of a service
    while (ServiceStatus.dwCurrentState == SERVICE_RUNNING)
    {
        char buffer[16];
        GlobalMemoryStatus(&memory);
        sprintf(buffer, "%d", memory.dwAvailPhys);
        int result = WriteToLog(buffer);
        if (result)
        {
            ServiceStatus.dwCurrentState       = SERVICE_STOPPED; 
            ServiceStatus.dwWin32ExitCode      = -1; 
            SetServiceStatus(hStatus, &ServiceStatus);
            return;
        }

        Sleep(SLEEP_TIME);
    }
    return; 
}

もう1つ言い忘れたのは、タスクマネージャーからサービスを強制的に実行すると機能するようです。

4

1 に答える 1

3

このコマンドsc create...はサービスを作成するだけで、開始は試みません。差出人sc /?

create----------サービスを作成します。(レジストリに追加します)。

サービスの開始を試みるには、サービス制御アプレットを介して、または以下を実行して開始します。

sc startMemoryStatus

于 2012-08-27T14:51:10.483 に答える