Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обмен данными между процессами.


Strate ©   (2009-02-16 12:23:00) 

Приветствую. Пишу программку, одна часть которой будет работать как сервис, а вторая - как оболочка пользователя. Причём основная функция оболочки - отображать некие данные, полученные из сервиса, а побочная - подавать некие команды сервису на выполнение, и получать результат выполнения этих команд. С получением данных выкрутился с помощью Memory Mapped Files, а вот с вызовом удалённых процедур никак не могу придумать. Самоу умное что приходит в голову - в сервисе запускать "ждущий" Thread, который будет ждать пока некий флаг не изменит своё состояние. Сменить флаг можно и из клиента. Но решение мне лично кажется немного кривым. Можно было бы выкрутиться с помощью стандартных Windows-сообщений, но сервис не имеет окон, да и не желательно из использовать, если запуск будет в виде службы Windows. Кто что может посоветовать, какие технологии использовать?

Спасибо большое заранее.


KSergey   (2009-02-16 16:33:00) [1]

> Медвежонок Пятачок ©   (16.02.09 14:52) [19]
> которые по tcp:80 разрешают выходить с рабочего места наружу?

Да! :)


Медвежонок Пятачок   (2009-02-16 14:52:00) [2]

которые по tcp:80 разрешают выходить с рабочего места наружу?


Медвежонок Пятачок   (2009-02-16 14:52:00) [3]

каких?


KSergey   (2009-02-16 14:45:00) [4]

> Медвежонок Пятачок ©   (16.02.09 14:14) [16]

Гнать таких сотрудников. И админов за одно.


Медвежонок Пятачок   (2009-02-16 14:14:00) [5]

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


Вариант   (2009-02-16 14:07:00) [6]


>  Обмен данными между процессами.
>
> Strate   (16.02.09 12:23)  


> Приветствую. Пишу программку, одна часть которой будет работать
> как сервис, а вторая - как оболочка пользователя.


Я так понимаю это разные процессы - сервис и оболочка пользователя?
В этом случае мое мнение (ИМХО):

Варианты с посылкой сообщения (PostThreadMessage или SendMessage) от оконного приложения к сервису и от сервиса к приложению мне кажутся неудачными. Причина - отчасти в [13], второе поведение на различных ОС Windows может требовать доп. условий, зависящих от платформы - подробнее на эту тему смотри в MSDN например о PostThreadMessage.  Более универсальные варианты на мой взгляд (и лучшие опять таки на мой взгляд) предложены в [2] (pipe и TCP/IP). Хотя если речь идет об одном флаге и работе программ на одной машине, то вполне можно было бы использовать и например именованное событие - смотри CreateEvent (обратим внимание на правила именования) или мьютекс.


KSergey   (2009-02-16 13:27:00) [7]

> clickmaker ©   (16.02.09 12:59) [10]
> WM_COPYDATA?

Да, именно так.

> насколько я знаю, нет. Оно только для синхронной отправки

Ваапще, конечно, да, я уже после ка кнаписал задумался о том, что речь про PostThreadMessage.
Впрочем, если понадеяться на счастье и передать указатель на глобальную структуру... :)
(не, это глпуость, конечно)


Сергей М.   (2009-02-16 13:08:00) [8]


> clickmaker ©   (16.02.09 13:03) [12]


Тогда снрвис становится зависимым от опции взаимодействия с раб.столом


clickmaker   (2009-02-16 13:03:00) [9]

ксати, можно и фиктивное окно создать
AllocateHWnd()
тогда можно и SendMessage( WM_COPYDATA использовать


Сергей М.   (2009-02-16 13:01:00) [10]

Для сервис-приложений, использующих дельфийский"шаблон", треды TServiceThread ожидают сообщение CM_SERVICE_CONTROL_CODE

Цитата:

{ TServiceThread }

const

 CM_SERVICE_CONTROL_CODE = WM_USER + 1;

Прочие сообщения попросту игнорируются.


clickmaker   (2009-02-16 12:59:00) [11]

> [7] KSergey ©   (16.02.09 12:48)

WM_COPYDATA?
насколько я знаю, нет. Оно только для синхронной отправки


KSergey   (2009-02-16 12:56:00) [12]

> Сергей М. ©   (16.02.09 12:52) [8]
> Смотря кем и кому оно посылается

Т.е.?! не понял в чем разница.
Окей, пусть будет клиентским приложением сервису.
А если наоборот? я что-то не улавливаю разницу.


Сергей М.   (2009-02-16 12:52:00) [13]


> KSergey ©   (16.02.09 12:48) [7]


Смотря кем и кому оно посылается


KSergey   (2009-02-16 12:48:00) [14]

> Сергей М. ©   (16.02.09 12:44) [5]
> > WM_COPY вроде ж тоже пройдет?
> Что значит "пройдет" ?

Для засылки в PostThreadMessage, не вру?


Сергей М.   (2009-02-16 12:46:00) [15]


> Strate   (16.02.09 12:43) [4]


> как быть в более сложным вариантом?


Смотря насколько он "сложен".


Сергей М.   (2009-02-16 12:44:00) [16]


> KSergey ©   (16.02.09 12:41) [2]


> WM_COPY вроде ж тоже пройдет?


Что значит "пройдет" ?


Strate   (2009-02-16 12:43:00) [17]


> Для простых команда с одним параметром вполне подойдет PostThreadMessage


Отлично, спасибо, попробую =)

А как быть в более сложным вариантом?


clickmaker   (2009-02-16 12:42:00) [18]

> но сервис не имеет окон

окна не обязательны. Достаточно создать очередь сообщений и получать их в цикле - PeekMessage или GetMessage

самый удобный способ в плане программирования - DCOM. Поскольку там передача и получение данных сводится к простому вызову методов.
Но для этого сервис должен быть зарегистрирован как COM-сервер, а клиент импортировать его tlb


KSergey   (2009-02-16 12:41:00) [19]

можно сервис сделать СОМ-сервером, можно DDE сервером, можно открыть в нем слушать TCP/IP или pipe....

> Сергей М. ©   (16.02.09 12:28) [1]
> Для простых команда с одним параметром вполне подойдет PostThreadMessage

WM_COPY вроде ж тоже пройдет?


Сергей М.   (2009-02-16 12:28:00) [20]

Для простых команда с одним параметром вполне подойдет PostThreadMessage


Наверх

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