Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.13;
Скачать: CL | DM;

Вниз

Форма из сервиса   Найти похожие ветки 

 
JR   (2004-12-16 16:31) [0]

Приветствую.

Нужно выводить из сервиса (права LocalSystem) на Desktop форму(TForm)(не сообщение!). То бишь сделать Interactive Service. Причём выводить на десктопе Winlogon"a (например, одновременно при окне авторизации Gin"ы )
------
Пытался написать сервис сам (API), но опыта нет и форму не получилось вывести даже на десктопе залогиненого пользователя (сам сервис работает). Пришлось воспользоваться услугами SvcMgr. Но форму удалось вывести только на десктопе пользователя...
Heeelp!


 
Digitman ©   (2004-12-16 16:42) [1]


> Пытался написать сервис сам (API) ..и форму
> не получилось ..


еще бы у тебя "получилось"!
WinAPI знать не знает ни о каких "формах".
"окно" <> "форма" !!


 
JR   (2004-12-16 16:47) [2]

Ну дак решить проблему?
CreateWindow тоже пробовал , видимо криво.


 
Digitman ©   (2004-12-16 17:04) [3]


> CreateWindow тоже пробовал , видимо криво


пробуй так, чтобы получилось "прямо".
между прочим, если тебе доселе сие было неизвестно, CreateWindow - это функция. А функция возвращает результат. А каждый из результатов, возвращаемых ЭТОЙ ф-цией, подробно описан в справке. И в справочной инф-ции к неуспешным рез-там работы этой ф-ции есть комментарии. вникнув в которые всегда можно понять, что было "криво" перед вызовом этой ф-ции.


 
JR   (2004-12-16 18:14) [4]

Ну, хорошо, уговорили. В этот раз в случае с CreateWindow всё "получилось "прямо".
> пробуй так, чтобы получилось "прямо".
> между прочим, если тебе доселе сие было неизвестно, CreateWindow
> - это функция. А функция возвращает результат. А каждый
> из результатов, возвращаемых ЭТОЙ ф-цией, подробно описан
> в справке. И в справочной инф-ции к неуспешным рез-там работы
> этой ф-ции есть комментарии. вникнув в которые всегда можно
> понять, что было "криво" перед вызовом этой ф-ции.

Ну зачем же так издеваться уж, конечно известно и более того, функция тогда отрабатывалась нормально (без ошибок).

Тем не менее, вопрос остаётся : как из сервиса показать ФОРМУ на десктопе винлогона?


 
Хакер ©   (2004-12-16 18:21) [5]

JR   (16.12.04 18:14) [4]
имхо хуком :)))


 
DeadMeat ©   (2004-12-16 18:56) [6]

Может запустить другое приложение (с окном) или себя (как приложение а не сервис) на этом "столе" через CreateProcess? Там вроде можно указать, на каком десктопе работать... Могу ошибаться. Сам не пробовал.

---
...Death Is Only The Begining...


 
Fay ©   (2004-12-17 05:04) [7]

SERVICE_INTERACTIVE_PROCESS - знакомое слово?


 
JR   (2004-12-17 07:54) [8]


> SERVICE_INTERACTIVE_PROCESS - знакомое слово?

Знакомо, и что?


 
Fay ©   (2004-12-17 08:11) [9]

Я на всякий случай спросил - код пока никто не видел.


 
JR   (2004-12-17 08:15) [10]


> Может запустить другое приложение (с окном) или себя (как
> приложение а не сервис) на этом "столе" через CreateProcess?
> Там вроде можно указать, на каком десктопе работать... Могу
> ошибаться. Сам не пробовал.


Да, есть в структуре STARTUPINFO параметр lpDesktop, хотя его действие я пока не тестил. ИМХО, будет муторно делать ещё один екзешник, или , пусть даже, пихнуть форму и все причиндалы в тот же EXE, что и сервис. Но если не предложат более «правильного» пути решения,придётся...
Почему, например, не работает следующее:

procedure TService1.ServiceExecute(Sender: TService);
var
 Form:TForm;
begin
 _hwinsta := OpenWindowStation("WinSta0", false, GENERIC_ALL);
 SetProcessWindowStation(_hwinsta);
 _hdesk := OpenDesktop("Winlogon", 0, false,GENERIC_ALL);
 SetThreadDesktop(_hdesk);
//  SwitchDesktop(_hdesk);
 Form:=TForm.Create(nil);
 Form.ParentWindow:=_hdesk;
 Form.Show;
 ServiceThread.ProcessRequests(true);
end;
ЗЫ: Функции выполняются без ошибок!


 
JR   (2004-12-17 08:17) [11]


> Я на всякий случай спросил - код пока никто не видел.

Кода пока вообще, как такового, нет :((. Пока есть только форма.


 
JR   (2004-12-17 08:19) [12]

В приведённый выше код Form.ParentWindow:=_hdesk попало случайно... Прошу прощения за флуд.


 
Digitman ©   (2004-12-17 08:34) [13]

в обработчике события OnCreate просто напиши

MyForm := TMyForm.Create(self);
MyForm.Show;

и всех делов


 
Fay ©   (2004-12-17 08:42) [14]

2 JR   (17.12.04 08:15) [10]
Похоже на попытку переключения из WinLogon-a в WinLogon?

З.Ы.
Блин! Не понимаю я эти дельфиные сервисы! 8((


 
Digitman ©   (2004-12-17 08:58) [15]


> Fay ©   (17.12.04 08:42) [14]


> Не понимаю я эти дельфиные сервисы


а что там непонятного ? svcmgr - это просто оболочка к winsvc ..
самое главное, что нужно раз и навсегда зарубить себе на носу при работе с этой оболочкой - обработчики OnCreate/OnDestroy вызываются в контексте осн.трэда сервис-процесса, а обработчики OnStart/OnStop/OnExecute - в доп.трэде того сервиса, который ассоциирован с объектом TService


 
Fay ©   (2004-12-17 09:00) [16]

2 Digitman ©   (17.12.04 08:58) [15]

1) Спасибо
2) Я писал сервис на API - мне показалось намного проще (понятнее). М.б. я просто тупой 8(


 
JR   (2004-12-17 17:09) [17]

2 Digitman (17.12.04 08:34) [13]
В OnCreate сервиса? т.е. вprocedure TService1.ServiceCreate(Sender: TObject)? Конечно, больше некуда, но всёйже. Поставил создание формы туда - не помогло. Форма исправно появляется на юзерском десктопе после логона.

2 Fay © (17.12.04 08:42) [14]
> Похоже на попытку переключения из WinLogon-a в WinLogon?
Почему?


 
tesseract   (2004-12-17 17:10) [18]

Вообще нельзя из сервиса (даже интерактивного) окно делать - у него очень высокий приоритет - такие тормоза в системе будут! не считая глюков. Как правило делается сервис и клиентское приложение общающееся через DDE - в MSDN говорят, что только так и никак иначе.


 
JR   (2004-12-17 17:33) [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.


 
Игорь Шевченко ©   (2004-12-17 17:58) [20]

А под формой на дескопе WinLogon"а очевидно подразумевается окно "Вход в систему" ?


 
JR   (2004-12-17 18:07) [21]

2 Игорь Шевченко (17.12.04 17:58) [20]

Моя форма


 
Игорь Шевченко ©   (2004-12-17 18:09) [22]

JR   (17.12.04 18:07) [21]

Я понимаю. Но она должна быть похожа на "вход в систему" ?


 
JR   (2004-12-17 19:22) [23]

В смысле "похожа"? Нет, не обязательно.


 
DeadMeat ©   (2004-12-17 20:24) [24]


> Я понимаю. Но она должна быть похожа на "вход в систему"
> ?

Это походу такой намек... Да?

---
...Death Is Only The Begining...


 
JR   (2004-12-17 21:29) [25]

Вот тоже думаю...


 
Игорь Шевченко ©   (2004-12-17 23:59) [26]

Так на десктопе Winlogon"а запрещено создавать формы...Как раз с целью предотвращения создания таких вот окон. Нужную форму можно показать, написав свою Gina.dll и только так.


 
JR   (2004-12-18 01:29) [27]

Игорь Шевченко (17.12.04 23:59) [26]

Как понять "таких вот окон"? Когда создаю ОКНО на API, то всё работает замечательно. Но просто окно мне не нужно, мне туда подавай ещё всякие VCL компоненты (TLabel и мн.др.). А как подружить API и VCL тоже тогда придётся выяснять (и можно ли вообще). Уж простите, созданием окон на API вообще не занимался...

В Gin"e да, всё работает, форму показывает и даже является интерактивной, но появляются какие-то глюки. И большие минусы для меня сего решения это сложность отладки и дальнейшего обновления.


 
Игорь Шевченко ©   (2004-12-18 01:52) [28]

JR   (18.12.04 01:29) [27]


> Как понять "таких вот окон"?


под понятием "такие вот окна" подразумеваются окна имитирующие вход в систему с последущей, пардон, банальной кражей паролей.
От таких окон десктоп Winlogon защищен.


> В Gin"e да, всё работает


> Уж простите, созданием окон на API вообще не занимался...


Так Gina - вполне документированный механизм расширения окна входа в систему, другие не предусмотрены.
Насчет того, как себя там VCL ведет - весьма вероятно, что и глючит, так как может требовать вызова функций, которые рассчитаны на полную инициализацию системы.


 
Хакер ©   (2004-12-18 11:07) [29]

JR   (18.12.04 1:29) [27]

> В Gin"e да, всё работает

дай пример на  xaker_delphi_sys@mail.ru

//давно хотел Giny поюзать ;))


 
JR   (2004-12-18 14:21) [30]


> От таких окон десктоп 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 14:46) [31]

JR   (18.12.04 14:21) [30]
вообще говорили что окно WinLogon"a Вход в систему  -  и от хука паролей защищено, так нет же ..  защита там очень слабая :))

- любит же M$ говорить не совсем точно :))))


 
JR   (2004-12-20 16:28) [32]

Как-то тихо стало... S


 
tesseract   (2004-12-21 09:54) [33]

>>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.


 
Digitman ©   (2004-12-21 10:17) [34]


> 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;


 
JR   (2004-12-21 17:20) [35]

Digitman  (21.12.04 10:17) [34]

1. А зачем мне "заботиться" о работе окна, пускай она там в отдельном треде и висит, тем более в onExecute нужно организовать другие циклы для работы. Ну ладно, не в этом суть.
2. Видимо разница в чём-то есть (не в последовательности, конечно), раз форма себя так капризно ведёт. Не работает с формой то, что работает с окном!
3. То же, что и в [13]. Конечно, проделывал и сие действие, но результата нуль (см. [17]). Если не жалко 5 минут, можете проделать то же самое у себя, может я чего не доглядел...

Прописал lpDesktop="WinSta0\Winlogon" структуры STARTUPINFO и запустил приложение с формой из сервиса. В этом случае работает, но хотелось бы решить сабж (на десктопе винлогона).


 
Digitman ©   (2004-12-21 17:59) [36]


> JR


Если ты столь туп и не желаешь НИ читать НИ анализировать исх-ки VCL - мне остается только сожалеть. Сие относится и к 1, и к 2, и к 3.


 
JR   (2004-12-22 07:58) [37]

Ну а если ты столь острый, мог бы написать хоть раз здесь что-нибудь умное, а не оскорблять и издеваться. Так что туп пока здесь только ты.

Остальным: проблема решена! Тема закрыта.



Страницы: 1 вся ветка

Текущий архив: 2005.02.13;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.034 c
1-1106805537
Chudaks
2005-01-27 08:58
2005.02.13
Как экспортировать текст вместе с графикой из MS Word


1-1107195857
Lyoha
2005-01-31 21:24
2005.02.13
Где скачать Дельфи?


4-1104071573
mariya_mezenceva
2004-12-26 17:32
2005.02.13
winexec(s,sw_show) - ругается


14-1106542876
Kerk
2005-01-24 08:01
2005.02.13
Филармония.


1-1107177813
BillyJeans
2005-01-31 16:23
2005.02.13
Адрес начала массива Image1.Canvas.Pixels