Показать сообщение отдельно
  #1  
Старый 22.07.2009, 12:08
mosian mosian вне форума
Прохожий
 
Регистрация: 22.07.2009
Сообщения: 2
Репутация: 10
По умолчанию Перехват сообщений в сервисе

Задача была в следующем получить какое-нибудь сообщение на подкл. USB устройства
ServiceProc – основной поток сервиса
ServiceCtrlHandler – Обработчик сообщенок.
Сервису не приходят дополнительные сообщения SERVICE_CONTROL_DEVICEEVENT но стандартные сообщения на старт стоп сервиса проходят.
Помогите разобраться, в чём подвох уже неделю бьюсь.

Код:
function ServiceCtrlHandler(dwControl: DWORD; dwEventType: DWORD; lpEventData, lpContext: LParam): BOOL; stdcall;
 begin
     ErrortoFile(inttostr(dwControl)); //Записываю любой пришедший код
   ......
 end;

{************************ Оснавная Функция сервиса ****************************}
procedure ServiceProc(argc : DWORD;var argv : array of PChar);stdcall;
var RegDN :pointer;
      dbi         :dev_broadcast_deviceinterface;
      size       :integer;
 begin
   RegDeregLog_Service;                                         //Подцепляем лог файл к службе если удачно fEventLog<>0
   SERV_STATUS.dwServiceType      := SERVICE_WIN32_OWN_PROCESS; //тип сервиса
   SERV_STATUS.dwCurrentState     := SERVICE_START_PENDING;     //Сервис находится в процессе запуска
   SERV_STATUS.dwControlsAccepted := SERVICE_ACCEPT_STOP;       //Сервис может быть остановлен.
   SERV_STATUS.dwWin32ExitCode           := NO_ERROR;
   SERV_STATUS.dwServiceSpecificExitCode := 0;
   SERV_STATUS.dwCheckPoint              := 0;
   SERV_STATUS.dwWaitHint                := 5000;           //Время необх. для полной рег. службы
   advapi32 := LoadLibrary('advapi32.dll');
   RegisterServiceCtrlHandlerEx:=GetProcAddress(advapi32, 'RegisterServiceCtrlHandlerExA');

   SERV_Handle := RegisterServiceCtrlHandlerEx(c_ServiceName,@ServiceCtrlHandler,1); //Регистрируем службу

   if SERV_Handle <> 0 then
    begin
      SERV_STATUS.dwCurrentState :=SERVICE_RUNNING; //меняем статус на запуск
      SERV_STATUS.dwCheckPoint   :=0;
      SERV_STATUS.dwWaitHint     :=0;
      SetServiceStatus(SERV_Handle,SERV_STATUS);    //Запуск сервиса

      size := sizeof(dev_broadcast_deviceinterface);
      zeromemory(@dbi, size);
      dbi.dbcc_size := size;
      dbi.dbcc_devicetype := dbt_devtyp_deviceinterface;
      dbi.dbcc_reserved := 0;
      dbi.dbcc_classguid := guid_devinterface_usb_device;
      dbi.dbcc_name := 0;
      RegDN := Registerdevicenotification(SERV_Handle,@dbi,1);

      //ОСНОВНОЙ КОД ПРОГРАММЫ
      repeat
        sleep(200);
      until SERV_STATUS.dwCurrentState = SERVICE_STOPPED;
Ответить с цитированием