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-17 17:09:00) [21]

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?
Почему?


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

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

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


Digitman   (2004-12-17 08:58:00) [23]


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


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


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


Fay   (2004-12-17 08:42:00) [24]

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

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


Digitman   (2004-12-17 08:34:00) [25]

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

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

и всех делов


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

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


JR   (2004-12-17 08:17:00) [27]


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

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


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

…
> Может запустить другое приложение (с окном) или себя (как
> приложение а не сервис) на этом "столе" через 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;
ЗЫ: Функции выполняются без ошибок!


Fay   (2004-12-17 08:11:00) [29]

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


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


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

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


Fay   (2004-12-17 05:04:00) [31]

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


DeadMeat   (2004-12-16 18:56:00) [32]

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

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


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

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


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

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

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

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


Digitman   (2004-12-16 17:04:00) [35]


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


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


JR   (2004-12-16 16:47:00) [36]

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


Digitman   (2004-12-16 16:42:00) [37]


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


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


Страницы:   1 2

Наверх

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