Задача была в следующем получить какое-нибудь сообщение на подкл. 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;