Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

межпроцессное взаимодействие

1.8K
20 февраля 2008 года
Arkady
153 / / 18.12.2007
Здравствуйте.
Задача стоит следующая. Есть какая-то программа А (возможно сервис), которая крутится на машине.
Я, соответственно, пишу другую (Б). Мне надо в некоторые моменты посылать то Б к А события, сигналить ей как-то. Чтобы она что-то делала.
Как строится такое универсальное взаимодействие?
(pipe, sockets - насколько я понимаю - средства для передачи данных, мне же надо только сигналить, какой-то аналог post_event, но при этом это разные процессы, разные бинарники, а насколько я понимаю эвенты и мьютексы - это только флаги и работают в рамках одного процесса).

И поэтому я не представляю как сделать так, чтобы один процесс видел флаг созданный и изменяемый другим процессом. А мне бы очень хотелось разобраться в этой теме.

Поскольку не знаю темы, ищу плохо, и пока нашел только как общаться с окнами в Windows через postmessage. Но мне бы хотелось поуниверсальнее, на случай, если не будет окон и если это вообще не винды.

Наверняка же при старте бинарника система где-то регистрирует процесс, регистрирует какие-то параметры бинарника, по которым сама его идентифицирует. Соответственно наверняка есть средства по этим параметрам бинарника найти этот процесс и как-то с ним взаимодействовать.

Заранее спасибо =)
489
20 февраля 2008 года
NeO_u
277 / / 11.10.2006
Хм...ну для начала, евенты и мютексы - слушать для синхронизации, а не для передачи. Кроме того, есть именованый мютекс, который может использоваться в разных процессах.

Второе. обычно, для обмена информацией в разных приложениях используют SendMessage(), почитай документацию о том, как ей пользоваться. Там много разных возможностей.

Pipe,Sockets - Это все таки больше для сетевого взаимодействия..а если крутится на одной машине, то обычно не используют.
11
20 февраля 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: Arkady
Здравствуйте.
Задача стоит следующая. Есть какая-то программа А (возможно сервис), которая крутится на машине.
Я, соответственно, пишу другую (Б). Мне надо в некоторые моменты посылать то Б к А события, сигналить ей как-то. Чтобы она что-то делала.
Как строится такое универсальное взаимодействие?
(pipe, sockets - насколько я понимаю - средства для передачи данных, мне же надо только сигналить, какой-то аналог post_event, но при этом это разные процессы, разные бинарники, а насколько я понимаю эвенты и мьютексы - это только флаги и работают в рамках одного процесса).

И поэтому я не представляю как сделать так, чтобы один процесс видел флаг созданный и изменяемый другим процессом. А мне бы очень хотелось разобраться в этой теме.

Поскольку не знаю темы, ищу плохо, и пока нашел только как общаться с окнами в Windows через postmessage. Но мне бы хотелось поуниверсальнее, на случай, если не будет окон и если это вообще не винды.

Наверняка же при старте бинарника система где-то регистрирует процесс, регистрирует какие-то параметры бинарника, по которым сама его идентифицирует. Соответственно наверняка есть средства по этим параметрам бинарника найти этот процесс и как-то с ним взаимодействовать.

Заранее спасибо =)



Код:
bool __stdcall EnumProc(HWND _HWND)
{
        if(_HWND)
        {
                HGLOBAL _HGLOBAL = GlobalAlloc(GMEM_SHARE, sizeof(unsigned long));

                DWORD * _PID     = (unsigned long *) GlobalLock(_HGLOBAL);
                DWORD _RESULT    = GetWindowThreadProcessId(_HWND, _PID);

                if(_RESULT)
                {
                        char _TITLE [110];
                        char _CLASS [ 95];

                        GetClassName (_HWND, _CLASS,  95);
                        GetWindowText(_HWND, _TITLE, 110);

                        Form1->ListBox1->Items->Add((AnsiString)* _PID  );
                        Form1->ListBox2->Items->Add((AnsiString)  _TITLE);
                        Form1->ListBox3->Items->Add((AnsiString)  _CLASS);
                }
        }

        return true;
}

ищешь по имени hwnd = HWND, и дальше
 
Код:
SendMessage(hwnd, ....);
1.8K
20 февраля 2008 года
Arkady
153 / / 18.12.2007
 
Код:
bool __stdcall EnumProc(HWND _HWND)
{
        if(_HWND)
        {
                HGLOBAL _HGLOBAL = GlobalAlloc(GMEM_SHARE, sizeof(unsigned long));

Вот мы выделили какую-то память для динамического обмена данными (как следует из описания функции)
 
Код:
DWORD * _PID     = (unsigned long *) GlobalLock(_HGLOBAL);

Тут мы её залочили (но при этом туда можно писать?), как следует из описания функции, и получили указатель на первый байт. Теперь эта память не может быть смещена или освобождена.
 
Код:
DWORD _RESULT    = GetWindowThreadProcessId(_HWND, _PID);

Это мы по указателю на виндовое окно получаем указатель на процесс, сделавший это окно, и пишем этот указатель в нашу залоченную память.
Код:
if(_RESULT)
                {
                        char _TITLE [110];
                        char _CLASS [ 95];

                        GetClassName (_HWND, _CLASS,  95);
                        GetWindowText(_HWND, _TITLE, 110);

                        Form1->ListBox1->Items->Add((AnsiString)* _PID  );
                        Form1->ListBox2->Items->Add((AnsiString)  _TITLE);
                        Form1->ListBox3->Items->Add((AnsiString)  _CLASS);
                }

А тут мы просто, если удалось проделать всё вышеперечисленное, забиваем на это и по указателю на окно берем его текст и имя.
В итоге, если всё прошло удачно, то в _PID будет указатель на поток, создавший окно.
Только не понятно, зачем под PID надо было так сложно выделять память, можно же было выделить её просто в локальной памяти задачи...
Так (без всего) тоже работает:
 
Код:
DWORD * _PID;
        _PID = (unsigned long *)malloc(8);

В этом коде же не показано, как другая программа к этому участку памяти смогла обратиться (да и откуда она узнает значение _PID, я и не понимаю). Собственно как другая программа выделит этот залоченный участок памяти среди прочей памяти я не понимаю.

Вопрос у меня вызывает ещё и следующее. Вот смотрите, с sockets всё понятно потому, что есть жестко определенный набор портов. И если я пишу одной программой в порт 25001, а другой именно из него читаю (на локалхосте), то я уверен, что отправится и получится одно и то же.

Потому что они обе под "порт 25001" понимают один и тот же объект операционной системы и не ошибутся.

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

Возвращаясь к примеру, нам на входе всё равно нужен указатель на окно. А если нет окон?
1
20 февраля 2008 года
kot_
7.3K / / 20.01.2000
Задайте в гугле Рихтер - потому как тема достаточно обширна сама по себе.
Но в общем (для упрощения понимания) - объекты для межпроцессорного взаимодействия - по сути это такиеже системные объекты как сокеты.
Это первое. Второе - и сокеты и пайпы и почтовые слоты - это средства межпроцессорного взаимодействия (это тем кто об этом не знает). Использование расшаренной памяти используеться как правило для передачи данных между приложением и драйвером - т.е. между разными уровнями системы.
9.3K
20 февраля 2008 года
iridum
175 / / 26.08.2007
Сокеты, мютексы, оконные сообщения, отображение в память . Путей куча, в конце концов можно если хочется просто передавать сообщение возданием файлов на диске ))))
1.8K
20 февраля 2008 года
Arkady
153 / / 18.12.2007
Цитата: iridum
Сокеты, мютексы, оконные сообщения, отображение в память . Путей куча, в конце концов можно если хочется просто передавать сообщение возданием файлов на диске ))))


=) Ну хочется всё-таки технически грамотное решение)) Создание файла на диске таковым не является)) С недавних пор я вообще решил, что если кодить, то никогда не через жопу =)

Сейчас читаю Джефри Рихтера (параллельно задав вопрос тут, я порылся в библиотеке нашей и нашел эту книгу (и несколько ещё), было здорово прочитать сообщение Кота, что надо взять эту книгу, когда на столе лежала именно она (а остальные я уже отнес обратно)).

Ну так вот. Одно из решений - именованные Мьютексы, Семафоры, Эвенты и т.п.. Создаются они в памяти ядра, контроль за ними общий, поиск - по имени (поскольку единое пространство имен для них всех). Просто и удобно =) Уже разобрался.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог