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;
}
межпроцессное взаимодействие
Задача стоит следующая. Есть какая-то программа А (возможно сервис), которая крутится на машине.
Я, соответственно, пишу другую (Б). Мне надо в некоторые моменты посылать то Б к А события, сигналить ей как-то. Чтобы она что-то делала.
Как строится такое универсальное взаимодействие?
(pipe, sockets - насколько я понимаю - средства для передачи данных, мне же надо только сигналить, какой-то аналог post_event, но при этом это разные процессы, разные бинарники, а насколько я понимаю эвенты и мьютексы - это только флаги и работают в рамках одного процесса).
И поэтому я не представляю как сделать так, чтобы один процесс видел флаг созданный и изменяемый другим процессом. А мне бы очень хотелось разобраться в этой теме.
Поскольку не знаю темы, ищу плохо, и пока нашел только как общаться с окнами в Windows через postmessage. Но мне бы хотелось поуниверсальнее, на случай, если не будет окон и если это вообще не винды.
Наверняка же при старте бинарника система где-то регистрирует процесс, регистрирует какие-то параметры бинарника, по которым сама его идентифицирует. Соответственно наверняка есть средства по этим параметрам бинарника найти этот процесс и как-то с ним взаимодействовать.
Заранее спасибо =)
Второе. обычно, для обмена информацией в разных приложениях используют SendMessage(), почитай документацию о том, как ей пользоваться. Там много разных возможностей.
Pipe,Sockets - Это все таки больше для сетевого взаимодействия..а если крутится на одной машине, то обычно не используют.
Цитата: Arkady
Здравствуйте.
Задача стоит следующая. Есть какая-то программа А (возможно сервис), которая крутится на машине.
Я, соответственно, пишу другую (Б). Мне надо в некоторые моменты посылать то Б к А события, сигналить ей как-то. Чтобы она что-то делала.
Как строится такое универсальное взаимодействие?
(pipe, sockets - насколько я понимаю - средства для передачи данных, мне же надо только сигналить, какой-то аналог post_event, но при этом это разные процессы, разные бинарники, а насколько я понимаю эвенты и мьютексы - это только флаги и работают в рамках одного процесса).
И поэтому я не представляю как сделать так, чтобы один процесс видел флаг созданный и изменяемый другим процессом. А мне бы очень хотелось разобраться в этой теме.
Поскольку не знаю темы, ищу плохо, и пока нашел только как общаться с окнами в Windows через postmessage. Но мне бы хотелось поуниверсальнее, на случай, если не будет окон и если это вообще не винды.
Наверняка же при старте бинарника система где-то регистрирует процесс, регистрирует какие-то параметры бинарника, по которым сама его идентифицирует. Соответственно наверняка есть средства по этим параметрам бинарника найти этот процесс и как-то с ним взаимодействовать.
Заранее спасибо =)
Задача стоит следующая. Есть какая-то программа А (возможно сервис), которая крутится на машине.
Я, соответственно, пишу другую (Б). Мне надо в некоторые моменты посылать то Б к А события, сигналить ей как-то. Чтобы она что-то делала.
Как строится такое универсальное взаимодействие?
(pipe, sockets - насколько я понимаю - средства для передачи данных, мне же надо только сигналить, какой-то аналог post_event, но при этом это разные процессы, разные бинарники, а насколько я понимаю эвенты и мьютексы - это только флаги и работают в рамках одного процесса).
И поэтому я не представляю как сделать так, чтобы один процесс видел флаг созданный и изменяемый другим процессом. А мне бы очень хотелось разобраться в этой теме.
Поскольку не знаю темы, ищу плохо, и пока нашел только как общаться с окнами в Windows через postmessage. Но мне бы хотелось поуниверсальнее, на случай, если не будет окон и если это вообще не винды.
Наверняка же при старте бинарника система где-то регистрирует процесс, регистрирует какие-то параметры бинарника, по которым сама его идентифицирует. Соответственно наверняка есть средства по этим параметрам бинарника найти этот процесс и как-то с ним взаимодействовать.
Заранее спасибо =)
Код:
ищешь по имени hwnd = HWND, и дальше
Код:
SendMessage(hwnd, ....);
Код:
bool __stdcall EnumProc(HWND _HWND)
{
if(_HWND)
{
HGLOBAL _HGLOBAL = GlobalAlloc(GMEM_SHARE, sizeof(unsigned long));
{
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);
}
{
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 = (unsigned long *)malloc(8);
В этом коде же не показано, как другая программа к этому участку памяти смогла обратиться (да и откуда она узнает значение _PID, я и не понимаю). Собственно как другая программа выделит этот залоченный участок памяти среди прочей памяти я не понимаю.
Вопрос у меня вызывает ещё и следующее. Вот смотрите, с sockets всё понятно потому, что есть жестко определенный набор портов. И если я пишу одной программой в порт 25001, а другой именно из него читаю (на локалхосте), то я уверен, что отправится и получится одно и то же.
Потому что они обе под "порт 25001" понимают один и тот же объект операционной системы и не ошибутся.
А вот как получить подобное взаимодействие не через порт, я уже не понимаю. Потому что мне не понятно, как другая программа узнает, где именно тот кусок памяти залочен, который мы для неё выделили и заполнили.
Возвращаясь к примеру, нам на входе всё равно нужен указатель на окно. А если нет окон?
Но в общем (для упрощения понимания) - объекты для межпроцессорного взаимодействия - по сути это такиеже системные объекты как сокеты.
Это первое. Второе - и сокеты и пайпы и почтовые слоты - это средства межпроцессорного взаимодействия (это тем кто об этом не знает). Использование расшаренной памяти используеться как правило для передачи данных между приложением и драйвером - т.е. между разными уровнями системы.
Сокеты, мютексы, оконные сообщения, отображение в память . Путей куча, в конце концов можно если хочется просто передавать сообщение возданием файлов на диске ))))
Цитата: iridum
Сокеты, мютексы, оконные сообщения, отображение в память . Путей куча, в конце концов можно если хочется просто передавать сообщение возданием файлов на диске ))))
=) Ну хочется всё-таки технически грамотное решение)) Создание файла на диске таковым не является)) С недавних пор я вообще решил, что если кодить, то никогда не через жопу =)
Сейчас читаю Джефри Рихтера (параллельно задав вопрос тут, я порылся в библиотеке нашей и нашел эту книгу (и несколько ещё), было здорово прочитать сообщение Кота, что надо взять эту книгу, когда на столе лежала именно она (а остальные я уже отнес обратно)).
Ну так вот. Одно из решений - именованные Мьютексы, Семафоры, Эвенты и т.п.. Создаются они в памяти ядра, контроль за ними общий, поиск - по имени (поскольку единое пространство имен для них всех). Просто и удобно =) Уже разобрался.