Форум: "Система";
Текущий архив: 2002.04.29;
Скачать: [xml.tar.bz2];
Внизкак в сервисе NT создать видимое окно? Найти похожие ветки
← →
goshavt (2002-01-31 11:54) [0]Задача в общем такая, нужно запустить диалер до входа в систему,
я написал сервис (на ВСВ5 под NT4 Workstation, а будет под сервером), запустил прогу, но под ВСВ все работает, а под сервисом тоже вроде работает, процес в списке всех процесов я вижу, но окна нет, тоже происходит и с формой, она создается показывается(выполняется FormShow), но на экране не появлятся, тоже происходит и с MessageBox, он запускается и ждет нажатия кнопки Ок, а так как окна нет то нажать нечего и сервис виснет.
Я так понимаю что окна создаются нормально, но они скрыты, а как их показать не знаю. Помогите!
← →
doomin (2002-01-31 14:03) [1]Попробуй после инсталляции сервиса в панели управления в его настройках разрешить ему доступ к рабочему столу (есть там такая птица). MessageBox точно начинает работать - проверено, но под Delphi
← →
Petrovich (2002-01-31 14:08) [2]MSDN:
Console and GUI applications started from a service process during a particular logon session are run on an invisible window station and desktop that are unique to that session. The window station and desktop are created automatically when the first application in the session starts; they are destroyed when the last application exits. There is no way to make these invisible desktops visible.
If you want a service in the localsystem account to interact with the logged-on user, specify the SERVICE_INTERACTIVE_PROCESS flag in the call to CreateService(). For example:
schService = CreateService(
schSCManager,
serviceName,
serviceName,
SERVICE_ALL_ACCESS,
SERVICE_INTERACTIVE_PROCESS | SERVICE_WIN32_OWN_PROCESS,
SERVICE_DEMAND_START,
SERVICE_ERROR_NORMAL,
lpszBinaryPathName,
NULL,
NULL,
NULL,
NULL,
NULL );
If you specify an account other than localsystem when using SERVICE_INTERACTIVE_PROCESS, you will get error INVALID_PARAMETER (87).
If you use CreateProcess() to launch your process and you want your service to log onto the users desktop, assign the lpdesktop parameter of the STARTUPINFO struct with "WinSta0\\Default".
Services that simply need a visible user notification can do this by calling MessageBox() with the MB_SERVICE_NOTIFICATION flag. Using the MB_DEFAULT_DESKTOP_ONLY flag works as well, but only if the user"s desktop is active. If the workstation is locked or a screen saver is running, the call will fail.
NOTE: If you are writing code for an application that can be run as either a service or an executable, you can"t use MB_SERVICE_NOTIFICATION as well as a non-NULL hwndOwner.
Any output done to a window is not displayed or made available to the application in any way. Attempts to read bits from the display results in a failure.
GUI services do not receive WM_QUERYENDSESSION/WM_ENDSESSION messages at logoff and shutdown; instead, they receive CTRL_LOGOFF_EVENT and CTRL_SHUTDOWN_EVENT events. These services are not terminated by the system at logoff.
← →
goshavt (2002-01-31 16:48) [3]Спасибо всем! Задача решена.
PS.: Первый совет мне понравился больше, ;-))).
В компоненте TService есть свойство Interactive, которое за эту самую птицу отвечает, и при инсталяции сервиса её устанавливает.
← →
Tosov (2002-01-31 20:28) [4]goshavt
Попробуй теперь показать свою форму из сервиса, а когда она появится в списке задач (не процессов) сделать ей Завершить программу... Не исключено, что программа(сервис) всеже завершится
← →
Vovchik (2002-02-02 14:55) [5]2Tosov
>>Не исключено, что программа(сервис) всеже завершится
Завершится совершенно точно. Я это уже проверял и не нашёл способ обойти. Это плохо!
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2002.04.29;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c