Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #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;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:24.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter