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


Автор: Sleepman 19.11.2007, 14:07
Не могу найти причину, почему моему сервису не приходит event с кодом SERVICE_CONTROL_HARDWAREPROFILECHANGE?
Помогите пожалуйста!!!
код ниже

Код

#include <windows.h>
#include <dbt.h>
#include "service.h"


void main( ) 

   SERVICE_TABLE_ENTRY   DispatchTable[] = 
   { 
      { "Service", (LPSERVICE_MAIN_FUNCTION)SDService }, 
      { NULL, NULL } 
   }; 
 
   if (!StartServiceCtrlDispatcher( DispatchTable)) 
   { 
    ;
   }

 
DWORD WINAPI ServiceCtrlHandlerEx (DWORD dwControl,  DWORD dwEventType,
                                            LPVOID lpEventData,  LPVOID lpContext) 

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

          if( !SetServiceStatus ( MyServiceStatusHandle, &MyServiceStatus ) )
          { 
             status = GetLastError();  
          } 
            return NO_ERROR; 
 
       case SERVICE_CONTROL_INTERROGATE: 
       // Fall through to send current status. 
         break;
        case SERVICE_CONTROL_HARDWAREPROFILECHANGE:
          switch (dwEventType)
          {
            case DBT_CONFIGCHANGED:
              _asm {nop};
              break;
            case DBT_DEVNODES_CHANGED:
              _asm {nop};
              break;
          }
          break; 
       default: 
            _asm { nop };
    } 
 
    // Send current status. 
    if( !SetServiceStatus( MyServiceStatusHandle,  &MyServiceStatus ) ) 
    { 
     status = GetLastError(); 
       // SetServiceStatus error - в файл 
    } 
    return NO_ERROR; 
}

void WINAPI SDService (DWORD argc, LPTSTR *argv) 

    DWORD dwStatus = -1;              
    DWORD dwErr = -1;     

    MyServiceStatus.dwServiceType        = SERVICE_WIN32_OWN_PROCESS; 
    MyServiceStatus.dwCurrentState       = SERVICE_START_PENDING; 
    MyServiceStatus.dwControlsAccepted   = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE | SERVICE_ACCEPT_HARDWAREPROFILECHANGE; 
    MyServiceStatus.dwWin32ExitCode      = 0; 
    MyServiceStatus.dwServiceSpecificExitCode = 0; 
    MyServiceStatus.dwCheckPoint         = 0; 
    MyServiceStatus.dwWaitHint           = 0; 
 
  MyServiceStatusHandle = RegisterServiceCtrlHandlerEx ("Service", ServiceCtrlHandlerEx,
                                                        NULL);
 
    if ( MyServiceStatusHandle == (SERVICE_STATUS_HANDLE)0 ) 
    { 
        // в файл
        //SvcDebugOut(" [MY_SERVICE] RegisterServiceCtrlHandler failed %d\n", GetLastError()); 
        return; 
    } 

    MyServiceStatus.dwCurrentState       = SERVICE_RUNNING; 
    MyServiceStatus.dwCheckPoint         = 0; 
    MyServiceStatus.dwWaitHint             = 0; 
 
    if ( !SetServiceStatus ( MyServiceStatusHandle, &MyServiceStatus ) ) 
    { 
        dwErr = GetLastError(); 
       _asm { int 3 };
    } 
  return; 


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