Как остановить службу????
От: 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
Re: Как остановить службу????
От: Аноним  
Дата: 25.11.05 02:39
Оценка:
Здравствуйте, Black_, Вы писали:

B_>Почему служба останавливается с ошибкой 1053(служба вовремя не ответила на запрос)?


Вопрос, собственно говоря, не по С++, скорее — Winapi.
Re: Как остановить службу????
От: Anton Batenev Россия https://github.com/abbat
Дата: 25.11.05 04:48
Оценка: 3 (1)
Здравствуйте, Black_, Вы писали:

B_>Почему служба останавливается с ошибкой 1053(служба вовремя не ответила на запрос)?


а) К коду комментарии можно? А то разбираться где и что интересного мало.
б) Судя по MyService_main, если все хорошо, то ты из нее выходишь со статусом SERVICE_RUNNING, а должен выходить со статусом SERVICE_STOPPED и полностью остановленым сервисом — это как WinMain.
в) Хороший пример реализации службы есть у Рихтера в его программировании серверных приложений для W2K.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Как остановить службу????
От: VGD  
Дата: 01.12.05 14:39
Оценка: 3 (1)
Здравствуйте, Black_, Вы писали:

B_>Почему служба останавливается с ошибкой 1053(служба вовремя не ответила на запрос)?


B_> case SERVICE_CONTROL_STOP:

B_> ReportStatusToSCMgr(SERVICE_STOP_PENDING, NO_ERROR, 0);
B_> SvcDebugOut(" [MY_SERVICE] Leaving MyService \n",0);
B_> return;

а, где MyServiceStatus.dwCurrentState=SERVICE_STOPPED;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.