![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Service(служба) и Windows vista [D7]
alex.rus © (2010-08-25 09:06:00)Здравствуйте.
Есть служба полностью работает на ХР, служба просто выводит сообщение, но под вистой не хочет работать, т.е. она запускается, в службах стоит статус что работает, но ни одного сообщения не выводит. галочка "Разрешить взаимодействие с рабочим столом" стоит. Запускал от разных пользователей и от локального админа и от админа домена. И устанавливал службу тоже от разных пользователей результат один и тот же.
alex.rus (2010-08-27 09:30:00) [1]Ну так как я пишу службу в первый раз, то для первого раза скопировал этот код с какого-то сайта, и особо я так не разбирался в этом, но я пробовал и с true и с false. Я так понял что если стоит true то сервис ждет сообщений от системы
SERVICE_CONTROL_STOP
SERVICE_CONTROL_PAUSE
SERVICE_CONTROL_CONTINUE
SERVICE_CONTROL_SHUTDOWN
SERVICE_CONTROL_INTERROGATE
ну а если false то он не будет ничего ждать а просто будет продолжать цикл
while not Terminated do
ServiceThread.ProcessRequests(false);
но вот что именно нужно ставить в моем случае я не знаю. Подскажите?
Сергей М. (2010-08-26 16:00:00) [2]
> видимо до туда дело не доходит
А из каких соображений ты вызываешь метод ProcessRequests именно с параметром False ?
alex.rus (2010-08-26 15:45:00) [3]Не, файл у меня закрывался в TWHES.ServiceStop ошибка в другом была. Сейчас все пишет hHook=5113528
Но теперь не пишет в файл из функции HookProc видимо до туда дело не доходит теперь
Function HookProc(nCode: LongInt; wParam, lParam: LongInt): LongInt stdcall;
Var
.........
Begin
AssignFile(fs,'c:\txt1.txt');
rewrite(fs);
writeln(fs,'Hookproc');
CloseFile(fs);
If (nCode = HC_ACTION) And (wParam = WM_KEYUP) Then
Begin
.........
End;
Result := CallNextHookEx(hKeyHook, nCode, wParam, lParam);
End;
Может быть параметры функции не подходят, и надо уже другую функцию писать?
Сергей М. (2010-08-26 14:38:00) [4]> дело не доходит до hHook
А файл кто будет закрывать, Пушкин ?
Anatoly Podgoretsky (2010-08-26 14:37:00) [5]> alex.rus (26.08.2010 14:34:22) [22]
Вообще то дело не доходит до
writeln(fs,inttostr(hHook));
Но кто же пишет в голову диска?
alex.rus (2010-08-26 14:34:00) [6]
> Ставь хук в OnStart и снимай в OnStop
сделал так как вы посоветовали
procedure TWHES.ServiceStart(Sender: TService; var Started: Boolean);
begin
hHook := SetWindowsHookEx(WH_KEYBOARD_LL, @HookProc, HInstance, 0);
Started:=true;
end;
procedure TWHES.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
Stopped:=True;
end;
убрал цикл с GetMessage, все работает в ХР, а в висте нет
Если для проверки сделать так
procedure TWHES.ServiceStart(Sender: TService; var Started: Boolean);
begin
AssignFile(fs,'c:\txt.txt');
rewrite(fs);
writeln(fs,inttostr(hHook));
hHook := SetWindowsHookEx(WH_KEYBOARD_LL, @HookProc, HInstance, 0);
writeln(fs,inttostr(hHook));
Started:=true;
end;
то на диске С:\ просто создается пустой файл txt.txt
значит дело не доходит до hHook := SetWindowsHookEx(WH_KEYBOARD_LL, @HookProc, HInstance, 0); ?
Сергей М. (2010-08-26 09:37:00) [7]
> alex.rus © (26.08.10 07:23) [18]
> останавливаться только по выключению компа
Ну так она ж все равно останавливается не волшебным образом, а по получению SERVICE_CONTROL_STOP/SHUTDOWN. Получив это сообшение твоя служба возбудит событие OnStop, где ты вызываешь SThread.Terminate и ТУТ ЖЕ, т.е. не дождавшись фактического завершения потока TServiceThread, рапортуешь сервис-менеджеру о завершении работы своего сервиса установкой Stopped:=True.
А поток-то TServiceThread как работал, так и продолжает работать, вплоть до принудительногоснятия его с выполнения и уничтожения системой !
Ибо WM_QUIT ему никто не посылает, а на флаг Terminated, который ты взводишь в вызове SThread.Terminate, ему плевать с высокой колокольни - он этот флаг не опрашивает.
Да и зачем вообще в этойзадаче нужен еще один поток ?
Не нужен он здесь совсем. Ставь хук в OnStart и снимай в OnStop - этого вполне достаточно. Конечно же, при условии что указанная тобой хук-функция HookProc исполняется достаточно быстро.
Anatoly Podgoretsky (2010-08-26 09:32:00) [8]> sniknik (26.08.2010 08:03:19) [19]
Служба поддержки Микрософта не будет рассматривать заявку, если не
установлены все последние патчи, также поступают и другие.
sniknik (2010-08-26 08:03:00) [9]> чтобы было все как положено. Точно скажите из-за этого не работает или нет?
если найден глюк, его надо исправить, независимо от всего, и продолжать только после.
т.что "точно" тебя только "пошлют" как в службе поддержки если у клиента старая версия, и промежуточные исправляли какие то баги. независимо от того, что это были за баги и на, что жалобы. себе дороже разбирать "из-за этого это или не из-за этого".
т.что приведи код в порядок, к стандартному сервисному обработчику событий. и сам скажи "из-за этого не работает или нет".
alex.rus (2010-08-26 07:23:00) [10]
> Сергей М. © (25.08.10 15:19) [14]
>
> Ну так вот я тебя и спрашиваю, к какого перепугу цикл с
> GetMessage в теле метода TServiceThread.Execute завершит
> свое выполнение, если никто и никогда этому потоку не посылает
> WM_QUIT ?
Ну например в ХР я не посылаю wm_quit никогда потому что, служба работать должна все время и останавливаться только по выключению компа, и почему то все работает все нажатия клавиш перехватываются.
Ну раз вы прицепились к этому сообщению wm_quit значит это имеет какое то значение. наверно в висте есть какой-то контроль за сервисами и надо всё таки посылать это сообщение. или может и нет никакого контроля просто хотите чтобы было все как положено. Точно скажите из-за этого не работает или нет?
Anatoly Podgoretsky (2010-08-26 07:07:00) [11]> Юрий Зотов (26.08.2010 01:17:16) [16]
Но что он с Клавой собирается делать, звучит красиво.
Юрий Зотов (2010-08-26 01:17:00) [12]
> И сервис клаву будет мять?
Красивые имена...
Leonid Troyanovsky (2010-08-25 21:40:00) [13]
> alex.rus © (25.08.10 11:28) [6]
> Перехват сообщений от клавиатуры (нажатия клавиш имеется
> ввиду)
И сервис клаву будет мять?
--
Regards, LVT.
Сергей М. (2010-08-25 15:19:00) [14]Ну так вот я тебя и спрашиваю, к какого перепугу цикл с GetMessage в теле метода TServiceThread.Execute завершит свое выполнение, если никто и никогда этому потоку не посылает WM_QUIT ?
alex.rus (2010-08-25 14:33:00) [15]Вот этот кусок кода.
TServiceThread=class(TThread)
protected
procedure Execute; override;
end;
Procedure TServiceThread.Execute;
begin
hHook := SetWindowsHookEx(WH_KEYBOARD_LL, @HookProc, HInstance, 0);
While GetMessage(Msg, 0, 0, 0) Do
Begin
TranslateMessage(Msg);
DispatchMessage(Msg);
End;
If (hHook <> 0) Then UnhookWindowsHookEx(hHook);
end;
procedure TWHES.ServiceExecute(Sender: TService);
begin
while not Terminated do
ServiceThread.ProcessRequests(false);
end;
Сергей М. (2010-08-25 14:22:00) [16]Меня сейчас интересует одно - где конкретнов коде твоего проекта фигурирует этот цикл с GetMessage
alex.rus (2010-08-25 13:52:00) [17]Ни это ли вы имеете ввиду? обработчик события когда сервис останавливается.
procedure TWHES.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
SThread.Terminate;
Stopped:=True;
end;
А Можно ли сделать так?
procedure TWHES.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
UnhookWindowsHookEx(hKeyHook);
SThread.Terminate;
Stopped:=True;
end;
Или вы имеете ввиду что нужно отдельно обрабатывать эти сообщения
Сергей М. (2010-08-25 13:28:00) [18]
> WM_QUIT никто не будет посылать, как службу остановят так
> все и остановиться.
Зашибись логика.
Штатная остановка службы происходит по асинхронному командному сообщению SERVICE_CONTROL_STOP или SERVICE_CONTROL_SHUTDOWN, отправляемому сервис-менеджером сервису. Сервис получив это сообщение должен обработать его и отрапортовать сервис-менеджеру о своем останове.
Так вот в твоем коде в упор не видно ни ожидания ни обработки этих сообщений.
alex.rus (2010-08-25 12:55:00) [19]чуть-чуть переписал
без этого:
Exe := GetModuleHandle(nil);
If (hExe <> 0) Then hExe := LoadLibrary(PChar(ParamStr(0)));
получилось так
const
WH_KEYBOARD_LL=13;
hHook := SetWindowsHookEx(WH_KEYBOARD_LL, @HookProc, HInstance, 0);
While GetMessage(Msg, 0, 0, 0) Do
Begin
TranslateMessage(Msg);
DispatchMessage(Msg);
End;
If (hHook <> 0) Then UnhookWindowsHookEx(hHook);
в ХР работает в висте нет
> И кто же твоему сервису, крутящемуся, как я полагаю, в доп.
> потоке, будет посылать WM_QUIT для выхода из этого цикла
> ?
А WM_QUIT никто не будет посылать, как службу остановят так все и остановиться.
Ну я знаю что это не правильно =) но пока так.
QAZ (2010-08-25 11:37:00) [20]ну вобщем шоб хватать клаву длл вобще не нужны
в висте и выше из сервиса это не прокатит полюбому ибо изолирован