服务始终处于STOPPED状态

时间:2012-08-27 14:35:37

标签: c++ winapi windows-services

我遇到服务问题,当我尝试安装它时:

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

我在cmd中收到服务已成功安装的消息,但是当我通过任务管理器查看它时,它始终处于停止状态。还有一件事是服务甚至没有启动,因为我没有看到任何日志消息。

似乎存在权限或类似问题,你可以帮我解决这个问题吗?

我的主要服务功能是:

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; 
}

我忘了说的另一件事,当我强制运行服务frfom任务管理器时,它似乎工作。

1 个答案:

答案 0 :(得分:3)

命令sc create...仅创建服务,它不会尝试启动它。来自sc /?

  

create ----------创建服务。 (将其添加到注册表中)。

尝试启动服务要么通过服务控制小程序执行,要么运行:

  

sc启动MemoryStatus