Посылка сообщений в чужой процесс

Здесь можно найти готовые «кирпичики» — части кода, пригодные для построения более крупных проектов, а также решения различных типовых и не очень задач на VB.

Модератор: Brickgroup

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Посылка сообщений в чужой процесс

Сообщение tyomitch » 13.02.2005 (Вс) 3:54

Мессаги больше WM_USER - а именно такие используют, например, все Common Controls - по умолчанию не маршалятся, т.е. передаваемый в них указатель должен указывать на данные в АП получателя. Значит, надо как-то внедрять туда свой участок памяти и передавать указатель на него.

Эта техника не нова, она использовалась Оловянниковым в его примере "Who lives in my system tray" (правда, он у меня так и не заработал ни на одной Винде) и мной в теме "Расширить часики в трее". Здесь я хотел построить реюзабельный компонент для этого дела, чтобы не изобретать велосипед каждый раз.

Структура компонента: 2 файла - modMarshal.bas и cMarshal.cls
CreateMarshal создаёт по hWnd маршалер (объект cMarshal) заданного размера (по умолчанию - 1024 байта).
cMarshal::MarshalInto передаёт данные в процесс получателя
cMarshal::MarshalFrom получает данные из процесса получателя
cMarshal::SendMarshalledMessage шлёт сообщение указанному при создании объекта окну. Маршалится заданное количество байт, начиная с адреса lParam.

Объект cMarshal при своём уничтожении сам закроет все хэндлы, об этом заботиться не надо.

Совместимость: проверено на Win98, Win2000, WinXP; скорее всего, будет работать и в WinNT4.

Приложен пример использования: получение значков из Быстрого Запуска. Если раскомментировать начало Form_Load, то (в Win2000+) значки будут получаться из трея.
Вложения
Marshal.rar
(4.06 Кб) Скачиваний: 380
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.02.2005 (Вс) 16:17

Гы :)

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

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 13.02.2005 (Вс) 16:31

Потому что в WinNT маппинги не глобальны.
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 01.07.2005 (Пт) 11:27

Можно вопрос: а почему для Win98 не использовали просто VirtualAlloc? Зачем использовать FileMapping? Ведь память, выделенная VirtualAlloc глобальна(в 98ой)? Или нет :oops: :?:
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.07.2005 (Пт) 11:42

Судя по
MSDN писал(а):To allocate memory in the address space of another process, use the VirtualAllocEx function.
, нет :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 01.07.2005 (Пт) 12:51

А судя по этому:
MSDN писал(а):Client: Included in Windows XP, Windows 2000 Professional, and Windows NT Workstation 4.0
:?: К тому же чем отличается address space нашегно процесса от другого(речь, ессно об 98ом)
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 01.07.2005 (Пт) 13:43

В Win98, как и всюду в Win32, АП своё у каждого процесса.
Для работы с чужими АП нужен именно VirtualAllocEx, коего в Win9x нет.
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 01.07.2005 (Пт) 15:50

Тот факт, что для каждого процесса выделяются свои 4 Гигабайта адресного пространства характререн для WinNT или для Win32?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.07.2005 (Пт) 16:31

Второе.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 08.02.2007 (Чт) 18:32

Заранее извиняюсь за археологию :)

Просто интересно - а чем не угодил WM_COPYDATA?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.02.2007 (Чт) 22:23

Тем, что чужой процесс написан не мной. Как раз как в прилагаемом примере с таскбаром. И потому на WM_COPYDATA никак не реагирует.
Изображение


Вернуться в Кирпичный завод

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15

    TopList  
cron