Помогите плиз. Создаю область памяти. Код (Text): ===================================================================== run CreateFileMappingA, 0FFFFFFFFh, 0, PAGE_READWRITE, 0, 256, 0 mov [hMemory],eax run MapViewOfFile, hMemory, FILE_MAP_ALL_ACCESS, 0, 0, 0 mov [pMemory],eax ===================================================================== Заполняю структуру. LV_ITEM Код (Text): ===================================================================== mov eax, [pMemory] add eax,8 mov dword ptr [eax],00h ;iSubItem add eax,12 mov edx, [pMemory] mov dword ptr [eax],edx ;pszText add eax,4 mov dword ptr [eax],255 ;cchTextMax ===================================================================== И посылаю сообщение процессу. Код (Text): ===================================================================== run SendMessageA, [desktop], LVM_GETITEMTEXT, 00h, [pMemory] ===================================================================== Но почему-то он упорно возвращает только первые 20 символов, а где остальные непонятно. В чем фишка.
В данном случии это неважно, эфект один и тот же если я передам в структуру другую область памяти. Я не могу понять почему в память передается только 20 символов.
не знаю - попробовал быстренько - процесс с листбоксом вообще рушится... так ты пробовал писать не затирая структуру? может, функция пользуется ей в процессе? сделай файл длиннее, а в офсет запиши адрес сразу за структурой.
Все это уже пробовал непомогает. Здесь что-то другое. Проблема вроде в LVM_GETITEMTEXT, но что конкретно незнаю. Все отрабатывает без ошибок, но если текст длинее 20 символов SendMessageA возвращает, что передано 20 и в буфере строка в 20 символов и все. Может это вообще тупиковый вариант.
система? у меня - 2к. я раньше только из текстовых боксов писал/читал и кнопки нажимал на чужих окнах и чето читал про невозможность получения данных из некоторых контролов других процессов... может, с этим связано? я запускаю LIstView из примеров масма, беру хэндл окна hList, посылаю ему сообщение из другого процесса, и оно валится. (хотя тоже непонятно - если это защита, то валиться должен как минимум вызывающий процесс, или получать отказ...)
Валится из за разности адресов в процессах. Но я передаю глобальный адрес и ничего невалится. Есть метод решение данной задачи через хук, но я бы хотел обойтись без него.
У тебя наверное мастдай, вот кажется пример http://www.codeproject.com/threads/int64_memsteal.asp 1908688813__stealingmemory.zip
shoo я запускаю LIstView из примеров масма, беру хэндл окна hList, посылаю ему сообщение из другого процесса, и оно валится. (хотя тоже непонятно - если это защита, то валиться должен как минимум вызывающий процесс, или получать отказ...) И будет валиться! Во-первых, структура, в которой ты пишешь, что хочешь получить, должна жить в контексте того процесса, из которого ты хочешь забрать данные. Во-вторых, буфер, куда ты будешь читать текст, тоже должен жить в контексте того процесса, где твой ListView (это тебе не WM_GETTEXT, хотя я лично не догоняю, за каким факом MS не сделала _такими_ все сообщения). А в-третьих, маленькая, но очень волосатая 屁股 начнется тогда, когда ты попытаешься определить, сколько в ListView колонок. Большинство ListView'ов - контролы как контролы, но тот, который валяется на десктопе и показывает иконки, какой-то долбанутый. И которые в диалогах открытия и записи - тоже долбанутые (в XP, по крайней мере). Ну не умеют в Microsoft, чтобы ни разу не выдрючиться!
да вот об этом я и думал - как быть с глобальностью адреса: если это MMF, то его нужно тоже открыть в "том" процессе. вобщем, нужно, наверное, там поток создать, и через него связь держать. а GlobalAlloc/GlobalLock не подойдет, интересно? попробовал GlobalAlloc - ниче пока не считал, но и не завалил, но сегодня уже все
Через внедрение это просто. А вот как через Map. Нашел почему возвращает 20 символов. Все дело в Map'е, почемуто распределяется только 20 байт. Какие вообще есть подводные камни при работе с Map'ом
через Мар нужно в "том" процессе открыть этот же Мар, видимо, дополнительным потоком... кстати, провел лаб работу по GlobalAlloc - все вроде бы и глобал, и фиксед - а болт! из разных процессов друг друга не видят - значит, нужно либо Мар, либо Пип (запускайте два экземпляра, ? - в верхний бокс выводит полученный от GlobalAlloc адрес, читать - читает в нижний бокс по адресу из верхнего бокса, писать - пишет аналогично. можно взять адрес из одного процесса и предложить его другому процессу... гы-гы) _1633940080__intercom.zip