Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Форма из сервиса [D6, Win2k, WinXP]


Страницы:   1 2

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 говорят, что только так и никак иначе.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо