服务始终处于STOPPED状态

Service always in STOPPED state

本文关键字:STOPPED 状态 服务      更新时间:2023-10-16

当我尝试像这样安装服务时,我遇到了一个问题:

sc create MemoryStatus binpath= "C:UsersrockDocumentsVisual Studio 2010ProjectsServiceInCReleaseServiceInC.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任务管理器时,它似乎起作用了。

命令sc create...只创建服务,不尝试启动它。从sc /?:

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

要尝试启动服务,请通过服务控制小程序或运行

sc启动内存状态