Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Создание петли сообщений  (Прочитано 12886 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Daniloff
Помогающий

ru
Offline Offline

« : 11-12-2006 11:22 » 

Проблема такая: имеется пример сервиса из microsoft SDK. Это консольное приложение. Я добавляю в него функции создания окна и петлю сообщений. При запуске в режиме простого приложения окно создается и собщения принимает. При запуске в качестве службы (с одступом к десктопу) создается висячее окно, никаких собщений не получающее. И при запуске в качестве службы под правами пользователя вообще не создается окно, хотя процесс в памяти болтается. В чем может быть прикол?
Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 11-12-2006 11:58 » 

А ты точно уверен, что тебе нужен сервис с GUI?

Сколько я видел сервисов, которые позволяют себе вести диалоги с пользователем, они все построены по клиент-серверной архитектуре. То есть собственно сервис, без интерактивных фич (как ты сказал - болтается в памяти) и клиентское приложение, которое с сервисом взаимодействует через интерфейс (сокеты, COM/DCOM, rpc ...)

Более того, в MSDN написано, что элементы GUI в случае сервисов работать не должны.
Windows Service applications run in a different window station than the interactive station of the logged-on user. A window station is a secure object that contains a Clipboard, a set of global atoms, and a group of desktop objects. Because the station of the Windows service is not an interactive station, dialog boxes raised from within a Windows service application will not be seen and may cause your program to stop responding.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Daniloff
Помогающий

ru
Offline Offline

« Ответ #2 : 11-12-2006 12:17 » 

сокеты отпадают. Задача сервиса - принимать сообщения от программы, перехватывающей winsock API. А если она сама будет порождать трафик - это будет рекурсия. Я пытался реализовать межпроцессный обмен при помощи WM_COPYDATA, но видимо, придется попробовать через общую память, хотя там гмеморроя будет больше...
Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 11-12-2006 12:35 » 

Сделай через COM.  В пределах одной машины он не не пользуется сокетами.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 11-12-2006 13:29 » 

Сколь мне известно, сервисы вообще не имеют доступа к GUI (по крайней мере в NT-версиях Windows). Сервис работает вне зависимости от того, какой пользователь (и сколько пользователей для Server-версий) залогинено в систему. Прикладное приложение получает доступ к GUI только тогда, когда запущено от имени какого-либо зашедшего в систему пользователя, имеющего desktop и всё прочее, что ему полагается иметь. Сервис в общем случае не знает, с каким (и чьим) desktop-ом ему работать. Кроме того не гарантируется, что вообще какой-нибудь desktop будет иметься в данный момент в системе.

Такие задачи решаются обычно написанием клиентского приложения, запускающегося пользователем и каким-либо образом взаимодействующего с сервисом для получения необходимых для работы GUI данных.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 11-12-2006 13:30 » 

О, npak уже это написал Улыбаюсь.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Daniloff
Помогающий

ru
Offline Offline

« Ответ #6 : 11-12-2006 15:57 » 

Сколь мне известно, сервисы вообще не имеют доступа к GUI (по крайней мере в NT-версиях Windows).

У сервиса есть атрибут - доступ к десктопу. Если он включен - сервис может себя проявлять на рабочем столе текущего  юзера... Если отключен - то не может. А мне не нужно ничего демонстрироваь. Достаточно скрытого окна - которому можно сообщение передать...
Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 11-12-2006 16:05 » 

посмотри вот здесь http://www.dotnet247.com/247reference/msgs/36/184244.aspx
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 12-12-2006 05:23 » 

Daniloff, не изобретай велосипед, используй то что и другие сервисы используют для связи с другими приложениями. Открывай именнованный канал в сервесе, и пускай все клиенты через него подключаются к нему.
Записан
Daniloff
Помогающий

ru
Offline Offline

« Ответ #9 : 12-12-2006 09:07 » 

Serg79, а по каналу данные разве не UDP-сокетом передаются?
Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 12-12-2006 10:15 » 

Если Ты будешь открывать именнованный канал открытый для прослушивания на другой машине, то ты прав, будет использоваться UDP. Если же канал открыт для прослушивания на локальной машине, то используется проецируемый в память файл.
С таким же успехом твое приложение может запускать чужие консольные приложения и перенапровлять его потоки (stdio, stdout) в именнованный канал открытый тобой раннее, в этом случае даже консольное окно запускаемого приложения на экране не появляется. А твое приложение будет иметь возможность получать и отправлять данный дочерному процессу.
Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 12-12-2006 10:17 » new

Кстати, можешь также использовать проецируемый в памяти файл. То же выход.
Записан
Daniloff
Помогающий

ru
Offline Offline

« Ответ #12 : 12-12-2006 10:21 » 

Спасибо, не знал таких особенностей. Попробую воспользоваться каналом. Надеюсь, скорость обмена будет выше, чем при использовании обмена через файл.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines