Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.051 c
14-1106417814
vet
2005-01-22 21:16
2005.02.13
"Сводка" свойств файла


1-1107081470
Neznaika
2005-01-30 13:37
2005.02.13
Луна


1-1107027485
ShimON
2005-01-29 22:38
2005.02.13
Как достать объект из ListItem


3-1105696569
Автор333
2005-01-14 12:56
2005.02.13
Вопрос по датам?


14-1106301757
07BB:080Dh
2005-01-21 13:02
2005.02.13
Java





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский