Почему моя DLL-ловушка не работает при установке из службы?

У меня есть эти функции, объявленные в моей DLL. Если я использую их в отдельном приложении, все идет хорошо, но при использовании их в сервисе я не получаю никакого результата. Крюка нет.

function HookProc(code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
  Result := CallNextHookEx(Code, code, wParam, lParam)
end;

procedure StartHook; stdcall;
begin
  HookHandle := SetWindowsHookEx(WH_GETMESSAGE, HookProc, hInstance, 0);
end;

procedure StopHook; stdcall;
begin
  UnhookWindowsHookEx(HookHandle);
end;

Проблема только с Вистой и выше.


person randydom    schedule 30.04.2012    source источник
comment
Боюсь, Vista заткнула зияющую дыру в безопасности. Службы работают в своем собственном сеансе. Если вы будете искать здесь услуги и подключение, вы найдете множество вопросов, на которые ответ будет отрицательным. Вам придется придумать другой способ связи.   -  person Tony Hopkinson    schedule 01.05.2012


Ответы (1)


Вы пытаетесь подключить приложение к другому рабочему столу. В документации по параметру dwthreadId для SetWindowsHookEx указано, что ты не сможешь это сделать:

Идентификатор потока, с которым должна быть связана процедура ловушки. Если этот параметр равен нулю, процедура ловушки связана со всеми существующими потоками, работающими на том же рабочем столе, что и вызывающий поток.

Помните, что изоляция сеанса 0 в Vista up означает, что ваши службы работают в другом сеансе (и, следовательно, на другом рабочем столе) от любых интерактивных рабочих столов.

Я предполагаю, что есть другие причины, которые остановят эту работу с сеанса 0. Вам нужно будет запустить этот код из процесса, который находится на том же рабочем столе, что и процессы, которые вы хотите перехватить.

person David Heffernan    schedule 01.05.2012