Как остановить службу????
От: Black_  
Дата: 24.11.05 21:24
Оценка:
Почему служба останавливается с ошибкой 1053(служба вовремя не ответила на запрос)?

static SERVICE_STATUS          MyServiceStatus;       
static SERVICE_STATUS_HANDLE   MyServiceStatusHandle;

BOOL ReportStatusToSCMgr(DWORD dwCurrentState, DWORD dwWin32ExitCode, DWORD dwWaitHint) 
{
    static DWORD dwCheckPoint = 1;

    if (dwCurrentState == SERVICE_START_PENDING)
        MyServiceStatus.dwControlsAccepted = 0;
    else
    MyServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;

    MyServiceStatus.dwCurrentState = dwCurrentState;
    MyServiceStatus.dwWin32ExitCode = dwWin32ExitCode;
    MyServiceStatus.dwWaitHint = dwWaitHint;

    if (dwCurrentState == SERVICE_RUNNING || dwCurrentState == SERVICE_STOPPED)
        MyServiceStatus.dwCheckPoint = 0;
    else
        MyServiceStatus.dwCheckPoint = dwCheckPoint++;

    if (!SetServiceStatus(MyServiceStatusHandle, &MyServiceStatus)) 
    {
        return FALSE;
    }

    return TRUE;
}
DWORD MyServiceInitialization(DWORD   argc, LPTSTR  *argv,DWORD *specificError) 
{
    argv; 
    argc; 
    specificError; 
    return(0); 
}

VOID SvcDebugOut(LPSTR String, DWORD Status) 
{
    CHAR  Buffer[1024]; 
    if (strlen(String) < 1000) 
    {
        sprintf(Buffer, String, Status); 
        OutputDebugStringA(Buffer); 
    }
}

VOID WINAPI MyServiceCtrlHandler (DWORD Opcode) 
{    DWORD status; 
    BOOL fStopDependencies;
    DWORD dwTimeout;
    
    switch(Opcode) 
    {
    case SERVICE_CONTROL_PAUSE:

        MyServiceStatus.dwCurrentState = SERVICE_PAUSED; 
        break;

    case SERVICE_CONTROL_CONTINUE: 

        MyServiceStatus.dwCurrentState = SERVICE_RUNNING; 
        break; 

    case SERVICE_CONTROL_STOP: 
        ReportStatusToSCMgr(SERVICE_STOP_PENDING, NO_ERROR, 0);
        SvcDebugOut(" [MY_SERVICE] Leaving MyService \n",0); 
        return; 
        
        case SERVICE_CONTROL_INTERROGATE: 
        break; 

        default: 
        break;
        SvcDebugOut(" [MY_SERVICE] Unrecognized opcode %ld\n",Opcode);
    }

    ReportStatusToSCMgr(MyServiceStatus.dwCurrentState, NO_ERROR, 0);
    return;
}


void WINAPI MyService_main (DWORD argc, LPTSTR *argv) 
{
    DWORD status; 
    DWORD specificError; 

    MyServiceStatusHandle = RegisterServiceCtrlHandler("MyService",MyServiceCtrlHandler); 

    if (MyServiceStatusHandle == (SERVICE_STATUS_HANDLE)0) 
    {
        SvcDebugOut(" [MY_SERVICE] RegisterServiceCtrlHandler failed %d\n", GetLastError()); 
        return; 
    }

    MyServiceStatus.dwServiceType        = SERVICE_WIN32; 
    MyServiceStatus.dwCurrentState       = SERVICE_START_PENDING; 
    MyServiceStatus.dwControlsAccepted   = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE; 
    MyServiceStatus.dwWin32ExitCode      = 0; 
    MyServiceStatus.dwServiceSpecificExitCode = 0; 
    MyServiceStatus.dwCheckPoint         = 0; 
    MyServiceStatus.dwWaitHint           = 0; 

    status = MyServiceInitialization(argc,argv, &specificError); 

    if (status != NO_ERROR)
    {
        MyServiceStatus.dwCurrentState       = SERVICE_STOPPED; 
        MyServiceStatus.dwCheckPoint         = 0; 
        MyServiceStatus.dwWaitHint           = 0; 
        MyServiceStatus.dwWin32ExitCode      = status; 
        MyServiceStatus.dwServiceSpecificExitCode = specificError; 

        SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus); 
        return;
    }

    MyServiceStatus.dwCurrentState       = SERVICE_RUNNING; 
    MyServiceStatus.dwCheckPoint         = 0; 
    MyServiceStatus.dwWaitHint           = 0; 

    if (!SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus)) 
    {
        status = GetLastError(); 
        SvcDebugOut(" [MY_SERVICE] SetServiceStatus error%ld\n",status); 
    }

} 
 
int _tmain()
{            
        SERVICE_TABLE_ENTRY   DispatchTable[] = 
        {
            {"MyService",MyService_main},
            {NULL,NULL} 
          }; 
 if (StartServiceCtrlDispatcher( DispatchTable)) 
    {
        SvcDebugOut(" [MY_SERVICE] StartServiceCtrlDispatcher (%d)\n",GetLastError()); 
    }
    return 0;
}



25.11.05 06:29: Перенесено модератором из 'C/C++' — Odi$$ey
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.