2012-04-30 3 views
2

У меня эти функции объявлены в моей 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; 

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

+3

Я боюсь, что отверстие для безопасности, подключенное к Vista. Сервисы запускаются в их собственной сессии. Если вы ищете здесь для «обслуживания и подключения», вы найдете множество вопросов, на которые ответ вы не можете. Вам придется придумать другой способ общения. –

ответ

2

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

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

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

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