![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Форма из сервиса [D6, Win2k, WinXP]
JR © (2004-12-16 16:31:00)Приветствую.
Нужно выводить из сервиса (права LocalSystem) на Desktop форму(TForm)(не сообщение!). То бишь сделать Interactive Service. Причём выводить на десктопе Winlogon'a(например, одновременно при окне авторизации Gin'ы )
------
Пытался написать сервис сам (API), но опыта нет и форму не получилось вывести даже на десктопе залогиненого пользователя (сам сервис работает). Пришлось воспользоваться услугами SvcMgr. Но форму удалось вывести только на десктопе пользователя...
Heeelp!
JR (2004-12-22 07:58:00) [1]Ну а если ты столь острый, мог бы написать хоть раз здесь что-нибудь умное, а не оскорблять и издеваться. Так что туп пока здесь только ты.
Остальным: проблема решена! Тема закрыта.
Digitman (2004-12-21 17:59:00) [2]
> JR
Если ты столь туп и не желаешь НИ читать НИ анализировать исх-ки VCL - мне остается только сожалеть. Сие относится и к 1, и к 2, и к 3.
JR (2004-12-21 17:20:00) [3]Digitman (21.12.04 10:17) [34]
1. А зачем мне "заботиться" о работе окна, пускай она там в отдельном треде и висит, тем более в onExecute нужно организовать другие циклы для работы. Ну ладно, не в этом суть.
2. Видимо разница в чём-то есть (не в последовательности, конечно), раз форма себя так капризно ведёт. Не работает с формой то, что работает с окном!
3. То же, что и в [13]. Конечно, проделывал и сие действие, но результата нуль (см. [17]). Если не жалко 5 минут, можете проделать то же самое у себя, может я чего не доглядел...
Прописал lpDesktop='WinSta0\Winlogon' структуры STARTUPINFO и запустил приложение с формой из сервиса. В этом случае работает, но хотелось бы решить сабж (на десктопе винлогона).
Digitman (2004-12-21 10:17:00) [4]
> JR (18.12.04 14:21) [30]
во-первых, непонятно, для чего нужно создавать еще один доп.трэд MainServiceThread(), если обработчик ServiceExecute() и так уже выполняется в контексте доп.трэда, автоматически созданного объектом TServiceApplication и ассоциированного с данным сервисом ..
во-вторых, все те действия по созданию и визуализации окна, которые ты выполняешь в myCreateWindow(), точно так же и в такой же последовательности выполняются и при создании/визуализации формы, так что разницы нет никакой.
другой вопрос, что создание/визуализацию формы как VCL-объекта корректно выполнять только в контексте осн.трэда (лучшее место для этого - обработчик TService.OnCreate) .. отсюда вывод - перенести все те действия, что ты выполняешь в OnExecute, в OnCreate, скажем, вот так :
//обработчик OnCreate
_hwinsta := OpenWindowStation('WinSta0', false, GENERIC_ALL);
SetProcessWindowStation(_hwinsta);
_hdesk := OpenDesktop('Winlogon', 0, false,GENERIC_ALL);
SetThreadDesktop(_hdesk);
SwitchDesktop(_hdesk);
MyForm := TMyForm.Create(Self);
MyForm.Show;
//никаких циклов по ожиданию/выборке/диспетчеризации вин-сообщений здесь реализовывать не нужно - цикл автоматически стартует в контексте осн.трэда сервис-процесса в ходе вызова метода TServiceApplication.Run
end;
//обработчик OnDestroy
MyForm.Free;
tesseract (2004-12-21 09:54:00) [5]>>to JR из MSDN
Note that running interactive services under the LocalSystem context is a dangerous practice and should be avoided. If a service that is running on a multiuser system must interact with a user, the service should do so through a separate GUI application running within the context of the user session. This GUI application should be designed to communicate with the service through some method of interprocess communication, such as a named pipe. This is a client/server implementation.
JR (2004-12-20 16:28:00) [6]Как-то тихо стало... S
Хакер (2004-12-18 14:46:00) [7]JR (18.12.04 14:21) [30]
вообще говорили что окно WinLogon'a Вход в систему - и от хука паролей защищено, так нет же .. защита там очень слабая :))
- любит же M$ говорить не совсем точно :))))
JR (2004-12-18 14:21:00) [8]
> От таких окон десктоп Winlogon защищен.
Почему-то тогда работает на API:
function MainServiceThread(p:pointer):DWord;stdcall;
begin
_hwinsta := OpenWindowStation('WinSta0', false, GENERIC_ALL);
SetProcessWindowStation(_hwinsta);
_hdesk := OpenDesktop('Winlogon', 0, false,GENERIC_ALL);
SetThreadDesktop(_hdesk);
SwitchDesktop(_hdesk);
myCreateWindow; //Там RegisterClassEx+CreateWindowEx+ShowWindow
While GetMessage(Mesg,0,0,0) do
begin
TranslateMessage(Mesg); DispatchMessage(Mesg);
end;
end;
procedure TService1.ServiceExecute(Sender: TService);
begin
hThread:=CreateThread(nil,0,@MainServiceThread,nil,0,ThID);
sleep(5000);
end;
Сервис целиком на API тем более воспринимает это на ура!
А форма не хочет работать. Может, действительно или инициализацию нужно, или всего лишь вызывать TForm "другим способом"?
Объясню тогда всю ситуацию. Задумывалось так: есть своя gina («своя» авторизация и прочие прелести) и сервис. Между ними организовано общение. Все формы и код размещаются в сервисе, а в gine только нужный, основной скелет программы для работы. Тем самым вышеупомянутые отладка и тем более обновление становятся оч. приятной процедурой. Безопасность, конечно, страдает, но это другая история...
Всё же, надеюсь на вашу помощь!
Хакер (18.12.04 11:07) [29]
Дай ка сооброжу... сегодня уйдёт, надеюсь : )
Хакер (2004-12-18 11:07:00) [9]JR (18.12.04 1:29) [27]
> В Gin'e да, всё работает
дай пример на xaker_delphi_sys@mail.ru
//давно хотел Giny поюзать ;))
Игорь Шевченко (2004-12-18 01:52:00) [10]JR (18.12.04 01:29) [27]
> Как понять "таких вот окон"?
под понятием "такие вот окна" подразумеваются окна имитирующие вход в систему с последущей, пардон, банальной кражей паролей.
От таких окон десктоп Winlogon защищен.
> В Gin'e да, всё работает
> Уж простите, созданием окон на API вообще не занимался...
Так Gina - вполне документированный механизм расширения окна входа в систему, другие не предусмотрены.
Насчет того, как себя там VCL ведет - весьма вероятно, что и глючит, так как может требовать вызова функций, которые рассчитаны на полную инициализацию системы.
JR (2004-12-18 01:29:00) [11]Игорь Шевченко (17.12.04 23:59) [26]
Как понять "таких вот окон"? Когда создаю ОКНО на API, то всё работает замечательно. Но просто окно мне не нужно, мне туда подавай ещё всякие VCL компоненты (TLabel и мн.др.). А как подружить API и VCL тоже тогда придётся выяснять (и можно ли вообще). Уж простите, созданием окон на API вообще не занимался...
В Gin'e да, всё работает, форму показывает и даже является интерактивной, но появляются какие-то глюки. И большие минусы для меня сего решения это сложность отладки и дальнейшего обновления.
Игорь Шевченко (2004-12-17 23:59:00) [12]Так на десктопе Winlogon'а запрещено создавать формы...Как раз с целью предотвращения создания таких вот окон. Нужную форму можно показать, написав свою Gina.dll и только так.
JR (2004-12-17 21:29:00) [13]Вот тоже думаю...
DeadMeat (2004-12-17 20:24:00) [14]
> Я понимаю. Но она должна быть похожа на "вход в систему"
> ?
Это походу такой намек... Да?
---
...Death Is Only The Begining...
JR (2004-12-17 19:22:00) [15]В смысле "похожа"? Нет, не обязательно.
Игорь Шевченко (2004-12-17 18:09:00) [16]JR (17.12.04 18:07) [21]
Я понимаю. Но она должна быть похожа на "вход в систему" ?
JR (2004-12-17 18:07:00) [17]2 Игорь Шевченко (17.12.04 17:58) [20]
Моя форма
Игорь Шевченко (2004-12-17 17:58:00) [18]А под формой на дескопе WinLogon'а очевидно подразумевается окно "Вход в систему" ?
JR (2004-12-17 17:33:00) [19]2 tesseract (17.12.04 17:10) [18]
Где ж такое написано? Пожалуйста, ткните ссылку для развития...
Вообще глюков и тормозов пока не замечено. А общаться между приложениями, слава богу и хелпу, уже научились ;-)
Но MSDN глаголит: Future versions of Windows may not support interactive services. Therefore, it is better to use another approach to support interaction between a user and a service.
tesseract (2004-12-17 17:10:00) [20]Вообще нельзя из сервиса (даже интерактивного) окно делать - у него очень высокий приоритет - такие тормоза в системе будут! не считая глюков. Как правило делается сервис и клиентское приложение общающееся через DDE - в MSDN говорят, что только так и никак иначе.