Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.04.2011, 01:10   #1
custanator
Новичок
Джуниор
 
Регистрация: 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);

помогите..........
custanator вне форума Ответить с цитированием
Старый 06.04.2011, 01:22   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

сообщения ListView не копируются в чужую память, вы вообще можете порушить чужое приложение.
задачу копирования придется делать самим.

вижу структуру итема вы копируете, а данные по указателям которые есть в этой структуре копируете?
потому вы и получаете строку обратно корреткную, указатель то в вашем процессе!
но не в чужом.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 06.04.2011 в 01:26.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.04.2011, 01:28   #3
custanator
Новичок
Джуниор
 
Регистрация: 06.04.2011
Сообщений: 17
По умолчанию

Цитата:
а данные по указателям которые есть в этой структуре копируете?
не совсем понимаю о чем вы..
вобщем говоря все что делается приведено в коде.
Цитата:
задачу копирования придется делать самим.
в какую сторону копать?
custanator вне форума Ответить с цитированием
Старый 06.04.2011, 01:33   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

в сторону того что помимо LV_Item надо вам копировать и данные на которые указывает член структуры pszText(текст то тоже надо перенести в чужой процесс)
кстати память освобождать не забывайте.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.04.2011, 01:34   #5
custanator
Новичок
Джуниор
 
Регистрация: 06.04.2011
Сообщений: 17
По умолчанию

Пепел Феникса, я Вам написал в ICQ. Подключитесь пожалуйста))
custanator вне форума Ответить с цитированием
Старый 06.04.2011, 01:36   #6
custanator
Новичок
Джуниор
 
Регистрация: 06.04.2011
Сообщений: 17
По умолчанию

WriteProcessMemory(hProcess, plviRemoteLVItem, @lviRemoteLVItem,
SizeOf(LV_ITEM), dwBytesWriten)

разве это и не есть по сути запись данных в чужой процесс?..
custanator вне форума Ответить с цитированием
Старый 06.04.2011, 01:43   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

это запись лишь структуры LV_Item
но в ней есть указатели, данные эти тоже надо переносить.

обьясню.
поле pszText хранит адрес текста который верный лишь для вашего процесса, в чужом процессе такого адреса может не быть(тогда приложение падает) или там чтото иное(тогда иероглифы)
текст то кто копировать будет?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.04.2011, 01:47   #8
custanator
Новичок
Джуниор
 
Регистрация: 06.04.2011
Сообщений: 17
По умолчанию

аааааа))) понятно!))) а как это делать?........(( даже не представляю...
custanator вне форума Ответить с цитированием
Старый 06.04.2011, 02:03   #9
custanator
Новичок
Джуниор
 
Регистрация: 06.04.2011
Сообщений: 17
По умолчанию

хотя... я же как бы выделяю память чужого процесса и использую как свой.
plviRemoteLVItem := VirtualAllocEx(hProcess, nil, SizeOf(LV_ITEM),
MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);
насколько понимаю...... если так то не должно быть такого что чужой процесс не имеет доступа к самому тексту
custanator вне форума Ответить с цитированием
Старый 06.04.2011, 03:08   #10
custanator
Новичок
Джуниор
 
Регистрация: 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));
custanator вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как перехватить чужой процесс 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