|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
06.04.2011, 01:10 | #1 |
Новичок
Джуниор
Регистрация: 06.04.2011
Сообщений: 17
|
SysListView32 Добавление Item (чужой процесс)
Есть приложение с компонентом SysListView32 с одной строкой.
Необходимо добавить новую строку(удалив текущую) или обновить существующий. Удаление проблемы не представляет. При добавлении новой строки(или обновлении текущей, с новым текстом) отображаются некорректные символы.(причем длина не совпадает с исходной строкой) Но при чтении из компонента возвращается корректная строка. Приходит 2 мысли на ум: проблема в кодировке или же пишу в память не туда куда надо Оптимального решения не нашел. procedure (LVHandle) var hProcess: THandle; dwProcessID: DWORD; dwBytesWriten: DWORD; plviRemoteLVItem: PLVItem; lviRemoteLVItem: LV_ITEM; vBuffer: array[0..255] of Char; begin if LVHandle = 0 then Exit; dwProcessID := 0; GetWindowThreadProcessId(LVHandle, @dwProcessID); if dwProcessID = 0 then Exit; hProcess := OpenProcess(PROCESS_ALL_ACCESS, True, dwProcessID); if hProcess = 0 then Exit; plviRemoteLVItem := VirtualAllocEx(hProcess, nil, SizeOf(LV_ITEM), MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE); if GetLastError <> 0 then Exit; ZeroMemory(@lviRemoteLVItem, SizeOf(LV_ITEM)); vBuffer:='NewTEXT'; with lviRemoteLVItem do begin mask := LVIF_TEXT; iItem := 0; iSubItem:= 0; cchTextMax:=128; pszText:=vBuffer; end; if not WriteProcessMemory(hProcess, plviRemoteLVItem, @lviRemoteLVItem, SizeOf(LV_ITEM), dwBytesWriten) then Exit; SendMessage(LVHandle, LVM_SETITEM, 0, Integer(plviRemoteLVItem)); // или SendMessage(LVHandle, LVM_INSERTITEM, 0, Integer(plviRemoteLVItem)); // если тут попробовать прочитать то что записали то строка возвращается корректная. VirtualFreeEx(hProcess, plviRemoteLVItem, 0, MEM_RELEASE); CloseHandle(hProcess); end; + если в pszText:=vBuffer; значение не фиксировать а брать из Едит то стороннее приложение вылетает. str:=edit.text; pszText:=pchar(str); помогите.......... |
06.04.2011, 01:22 | #2 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
сообщения ListView не копируются в чужую память, вы вообще можете порушить чужое приложение.
задачу копирования придется делать самим. вижу структуру итема вы копируете, а данные по указателям которые есть в этой структуре копируете? потому вы и получаете строку обратно корреткную, указатель то в вашем процессе! но не в чужом. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. Последний раз редактировалось Пепел Феникса; 06.04.2011 в 01:26. |
06.04.2011, 01:28 | #3 | ||
Новичок
Джуниор
Регистрация: 06.04.2011
Сообщений: 17
|
Цитата:
вобщем говоря все что делается приведено в коде. Цитата:
|
||
06.04.2011, 01:33 | #4 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
в сторону того что помимо LV_Item надо вам копировать и данные на которые указывает член структуры pszText(текст то тоже надо перенести в чужой процесс)
кстати память освобождать не забывайте. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
06.04.2011, 01:34 | #5 |
Новичок
Джуниор
Регистрация: 06.04.2011
Сообщений: 17
|
Пепел Феникса, я Вам написал в ICQ. Подключитесь пожалуйста))
|
06.04.2011, 01:36 | #6 |
Новичок
Джуниор
Регистрация: 06.04.2011
Сообщений: 17
|
WriteProcessMemory(hProcess, plviRemoteLVItem, @lviRemoteLVItem,
SizeOf(LV_ITEM), dwBytesWriten) разве это и не есть по сути запись данных в чужой процесс?.. |
06.04.2011, 01:43 | #7 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
это запись лишь структуры LV_Item
но в ней есть указатели, данные эти тоже надо переносить. обьясню. поле pszText хранит адрес текста который верный лишь для вашего процесса, в чужом процессе такого адреса может не быть(тогда приложение падает) или там чтото иное(тогда иероглифы) текст то кто копировать будет? Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
06.04.2011, 01:47 | #8 |
Новичок
Джуниор
Регистрация: 06.04.2011
Сообщений: 17
|
аааааа))) понятно!))) а как это делать?........(( даже не представляю...
|
06.04.2011, 02:03 | #9 |
Новичок
Джуниор
Регистрация: 06.04.2011
Сообщений: 17
|
хотя... я же как бы выделяю память чужого процесса и использую как свой.
plviRemoteLVItem := VirtualAllocEx(hProcess, nil, SizeOf(LV_ITEM), MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE); насколько понимаю...... если так то не должно быть такого что чужой процесс не имеет доступа к самому тексту |
06.04.2011, 03:08 | #10 |
Новичок
Джуниор
Регистрация: 06.04.2011
Сообщений: 17
|
vItem.pszText:= Pointer(Cardinal(vPointer) + SizeOf(TLVItem));
vItem.iSubItem:=0; vBuffer:='hello!'; //SetLength для pszText нужен? CopyMemory(vItem.pszText, @vbuffer, sizeof(vbuffer)); //так можно? //vItem.pszText:=Pointer(Cardinal(vPo inter) + SizeOf(TLVItem)); //или это тут? WriteProcessMemory(vProcess, vPointer, @vItem, SizeOf(TLVItem), vNumberOfBytesRead); SendMessage(hListView, LVM_SETITEMTEXT, 0, lparam(vPointer)); |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
как перехватить чужой процесс | Assemblerru | Win Api | 8 | 28.09.2010 20:07 |
Чужой SysListView32 | W0LF | Win Api | 1 | 24.02.2010 17:19 |
item | s1s1s1 | Общие вопросы Delphi | 2 | 07.10.2009 13:44 |
Изменение SysListView32 в другом приложении | Legos | Общие вопросы Delphi | 1 | 16.10.2007 02:29 |