![]() |
| ||
|
|
Новости |
Поиск |
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-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 знать не знает ни о каких "формах".
"окно" <> "форма" !!