Форум: "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.089 c