Форум: "Начинающим";
Текущий архив: 2009.04.05;
Скачать: [xml.tar.bz2];
ВнизОбмен данными между процессами. Найти похожие ветки
← →
Strate (2009-02-16 12:23) [0]Приветствую. Пишу программку, одна часть которой будет работать как сервис, а вторая - как оболочка пользователя. Причём основная функция оболочки - отображать некие данные, полученные из сервиса, а побочная - подавать некие команды сервису на выполнение, и получать результат выполнения этих команд. С получением данных выкрутился с помощью Memory Mapped Files, а вот с вызовом удалённых процедур никак не могу придумать. Самоу умное что приходит в голову - в сервисе запускать "ждущий" Thread, который будет ждать пока некий флаг не изменит своё состояние. Сменить флаг можно и из клиента. Но решение мне лично кажется немного кривым. Можно было бы выкрутиться с помощью стандартных Windows-сообщений, но сервис не имеет окон, да и не желательно из использовать, если запуск будет в виде службы Windows. Кто что может посоветовать, какие технологии использовать?
Спасибо большое заранее.
← →
Сергей М. © (2009-02-16 12:28) [1]Для простых команда с одним параметром вполне подойдет PostThreadMessage
← →
KSergey © (2009-02-16 12:41) [2]можно сервис сделать СОМ-сервером, можно DDE сервером, можно открыть в нем слушать TCP/IP или pipe....
> Сергей М. © (16.02.09 12:28) [1]
> Для простых команда с одним параметром вполне подойдет PostThreadMessage
WM_COPY вроде ж тоже пройдет?
← →
clickmaker © (2009-02-16 12:42) [3]> но сервис не имеет окон
окна не обязательны. Достаточно создать очередь сообщений и получать их в цикле - PeekMessage или GetMessage
самый удобный способ в плане программирования - DCOM. Поскольку там передача и получение данных сводится к простому вызову методов.
Но для этого сервис должен быть зарегистрирован как COM-сервер, а клиент импортировать его tlb
← →
Strate (2009-02-16 12:43) [4]
> Для простых команда с одним параметром вполне подойдет PostThreadMessage
Отлично, спасибо, попробую =)
А как быть в более сложным вариантом?
← →
Сергей М. © (2009-02-16 12:44) [5]
> KSergey © (16.02.09 12:41) [2]
> WM_COPY вроде ж тоже пройдет?
Что значит "пройдет" ?
← →
Сергей М. © (2009-02-16 12:46) [6]
> Strate (16.02.09 12:43) [4]
> как быть в более сложным вариантом?
Смотря насколько он "сложен".
← →
KSergey © (2009-02-16 12:48) [7]> Сергей М. © (16.02.09 12:44) [5]
> > WM_COPY вроде ж тоже пройдет?
> Что значит "пройдет" ?
Для засылки в PostThreadMessage, не вру?
← →
Сергей М. © (2009-02-16 12:52) [8]
> KSergey © (16.02.09 12:48) [7]
Смотря кем и кому оно посылается
← →
KSergey © (2009-02-16 12:56) [9]> Сергей М. © (16.02.09 12:52) [8]
> Смотря кем и кому оно посылается
Т.е.?! не понял в чем разница.
Окей, пусть будет клиентским приложением сервису.
А если наоборот? я что-то не улавливаю разницу.
← →
clickmaker © (2009-02-16 12:59) [10]> [7] KSergey © (16.02.09 12:48)
WM_COPYDATA?
насколько я знаю, нет. Оно только для синхронной отправки
← →
Сергей М. © (2009-02-16 13:01) [11]Для сервис-приложений, использующих дельфийский "шаблон", треды TServiceThread ожидают сообщение CM_SERVICE_CONTROL_CODE
Цитата:
{ TServiceThread }
const
CM_SERVICE_CONTROL_CODE = WM_USER + 1;
Прочие сообщения попросту игнорируются.
← →
clickmaker © (2009-02-16 13:03) [12]ксати, можно и фиктивное окно создать
AllocateHWnd()
тогда можно и SendMessage( WM_COPYDATA использовать
← →
Сергей М. © (2009-02-16 13:08) [13]
> clickmaker © (16.02.09 13:03) [12]
Тогда снрвис становится зависимым от опции взаимодействия с раб.столом
← →
KSergey © (2009-02-16 13:27) [14]> clickmaker © (16.02.09 12:59) [10]
> WM_COPYDATA?
Да, именно так.
> насколько я знаю, нет. Оно только для синхронной отправки
Ваапще, конечно, да, я уже после ка кнаписал задумался о том, что речь про PostThreadMessage.
Впрочем, если понадеяться на счастье и передать указатель на глобальную структуру... :)
(не, это глпуость, конечно)
← →
Вариант (2009-02-16 14:07) [15]
> Обмен данными между процессами.
>
> Strate (16.02.09 12:23)
> Приветствую. Пишу программку, одна часть которой будет работать
> как сервис, а вторая - как оболочка пользователя.
Я так понимаю это разные процессы - сервис и оболочка пользователя?
В этом случае мое мнение (ИМХО):
Варианты с посылкой сообщения (PostThreadMessage или SendMessage) от оконного приложения к сервису и от сервиса к приложению мне кажутся неудачными. Причина - отчасти в [13], второе поведение на различных ОС Windows может требовать доп. условий, зависящих от платформы - подробнее на эту тему смотри в MSDN например о PostThreadMessage. Более универсальные варианты на мой взгляд (и лучшие опять таки на мой взгляд) предложены в [2] (pipe и TCP/IP). Хотя если речь идет об одном флаге и работе программ на одной машине, то вполне можно было бы использовать и например именованное событие - смотри CreateEvent (обратим внимание на правила именования) или мьютекс.
← →
Медвежонок Пятачок © (2009-02-16 14:14) [16]кто хоть раз с работы управлял каким-нибудь универсал шаре даунлоадером, стоящим дома, тот тот обычно не парится над вопросом как организовать взаимодействие между процессами.
← →
KSergey © (2009-02-16 14:45) [17]> Медвежонок Пятачок © (16.02.09 14:14) [16]
Гнать таких сотрудников. И админов за одно.
← →
Медвежонок Пятачок © (2009-02-16 14:52) [18]каких?
← →
Медвежонок Пятачок © (2009-02-16 14:52) [19]которые по tcp:80 разрешают выходить с рабочего места наружу?
← →
KSergey © (2009-02-16 16:33) [20]> Медвежонок Пятачок © (16.02.09 14:52) [19]
> которые по tcp:80 разрешают выходить с рабочего места наружу?
Да! :)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.04.05;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.005 c