Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Ошибка при вызове StartServiceCtrlDispatcher


Автор: devmstr 18.4.2005, 09:46
Что я делаю не так?


Код

#include <windows.h>

#define SERVICE_NAME "PowerService"

SERVICE_STATUS          ServiceStatus; 
SERVICE_STATUS_HANDLE   ServiceStatusHandle; 


VOID WINAPI  ServiceMain (DWORD argc, LPTSTR *argv); 
VOID WINAPI  ServiceCtrlHandler (DWORD code);

VOID ServiceInitialization();

int WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, INT nCmdShow)
{
    SERVICE_TABLE_ENTRY DispatchTable[]= 
   { 
      { SERVICE_NAME, ServiceMain     }, 
      { NULL,              NULL          } 
   }; 

    if (!StartServiceCtrlDispatcher(DispatchTable))
    {
        MessageBox(NULL,"Service's register dispatch error","Error",MB_OK|MB_ICONERROR); //Все время перехожу сюда!!!
        return 1;
    }
    
}



VOID WINAPI  ServiceMain (DWORD argc, LPTSTR *argv)
{
    ServiceStatus.dwServiceType                = SERVICE_WIN32;
    ServiceStatus.dwServiceSpecificExitCode = 0;
    ServiceStatus.dwWin32ExitCode            = 0;
    ServiceStatus.dwCheckPoint                = 0;
    ServiceStatus.dwControlsAccepted        = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE;
    ServiceStatus.dwWaitHint                = 0;
    ServiceStatus.dwCheckPoint                = SERVICE_START_PENDING;

    ServiceStatusHandle    = RegisterServiceCtrlHandler(SERVICE_NAME,ServiceCtrlHandler);

    if (ServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)
    {
        MessageBox(NULL,"Service's register error","Error",MB_OK|MB_ICONERROR);
        return;
    }

    ServiceInitialization();

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


    MessageBox(NULL,"Ok","Ok",MB_OK|MB_ICONINFORMATION);
}

VOID WINAPI  ServiceCtrlHandler (DWORD code)
{
    switch(code) 
    { 
      case SERVICE_CONTROL_PAUSE: 
      // Do whatever it takes to pause here. 
         ServiceStatus.dwCurrentState = SERVICE_PAUSED; 
         break; 
 
      case SERVICE_CONTROL_CONTINUE: 
      // Do whatever it takes to continue here. 
         ServiceStatus.dwCurrentState = SERVICE_RUNNING; 
         break; 
 
      case SERVICE_CONTROL_STOP: 
      // Do whatever it takes to stop here. 
         ServiceStatus.dwWin32ExitCode = 0; 
         ServiceStatus.dwCurrentState  = SERVICE_STOPPED; 
         ServiceStatus.dwCheckPoint    = 0; 
         ServiceStatus.dwWaitHint      = 0; 

         if (!SetServiceStatus (ServiceStatusHandle, &ServiceStatus))
         { 
             MessageBox(NULL,"Service's set status error","Error",MB_OK|MB_ICONERROR);
             return;
         } 
   } 
   return; 

}


VOID ServiceInitialization()
{

}





[/code]

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)