Tamten kod (z mojego posta na którym się wzorowałeś) jest stary pisany jeszcze pod Windows 98 i jak widać nie działa pod XP... poza tym w swoim kodzie popełniłeś kilka błędów ale to nie ważne bo i tak nie zadziała na XP.
Z użyciem funkcji o, których piszesz pod XP działa coś takiego:
const
MAX_BUF = 250;
var
hWnd, hListView: THandle;
pProcessID, hProcess: Dword;
pStr, pItem: Pointer;
lvi: TLVITEM;
dCount: Dword;
buf: array[0..MAX_BUF] of Char;
begin
//zdobyc uchwyt ListView i ID procesu
hWnd:= FindWindow(nil, 'Testowa');
GetWindowThreadProcessId(hWnd, pProcessID);
hListView:= FindWindowEx(hWnd, 0, 'TListView', nil);
if (pProcessID > 0) and(hListView > 0) then
begin
hProcess:= OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or
PROCESS_VM_WRITE, False, pProcessID); //otworz proces
if (hProcess > 0) then
begin
//alokacja pamieci na odczytany tekst i strukturę TLVITEM
pStr:= VirtualAllocEx(hProcess, nil, MAX_BUF, MEM_COMMIT, PAGE_READWRITE);
pItem:= VirtualAllocEx(hProcess, nil, SizeOf(TLVITEM), MEM_COMMIT, PAGE_READWRITE);
try
lvi.iItem:= 1; //ktore item
lvi.iSubItem:= 0; //ktore subitem
lvi.mask:= LVIF_TEXT;
lvi.pszText:= pStr;
lvi.cchTextMax:= MAX_BUF;
//zapisz dane ze striuktury lvi do zaalokowanej pamieci
WriteProcessMemory(hProcess, pItem, @lvi, SizeOf(lvi), dCount);
//wyslij komunikat aby pobrac tekst
SendMessage(hListView, LVM_GETITEM, 0, Integer(pItem));
//odczytaj pobrany tekst do lokalnego buffera
ReadProcessMemory(hProcess, pStr, @buf, MAX_BUF, dCount);
finally
//zwolnij pamiec
VirtualFreeEx(hProcess, pStr, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, pItem, 0, MEM_RELEASE);
end;
ShowMessage(buf); //Pokaż co masz
CloseHandle(hProcess); //zamknij uchwyt procesu
end;
end;
end;
EDIT//
A tu jeszcze jeden podobny ale trochę zoptymalizowany kod (z tylko jedną alokacją pamięci).
Patryk27 najprawdopodobniej w założeniu czegoś podobnego miały służyć te obliczenia "bez sensu" z pierwszego posta.
const
MAX_BUF = 250;
var
hWnd, hListView: THandle;
pProcessID, hProcess: Dword;
pItem: Pointer;
lvi: TLVITEM;
dCount: Dword;
buf: array[0..MAX_BUF] of Char;
begin
//zdobyc uchwyt ListView i ID procesu
hWnd:= FindWindow(nil, 'Testowa');
GetWindowThreadProcessId(hWnd, pProcessID);
hListView:= FindWindowEx(hWnd, 0, 'TListView', nil);
if (pProcessID > 0) and(hListView > 0) then
begin
hProcess:= OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or
PROCESS_VM_WRITE, False, pProcessID); //otworz proces
if (hProcess > 0) then
begin
//alokacja pamieci na odczytany tekst i strukturę TLVITEM
pItem:= VirtualAllocEx(hProcess, nil, SizeOf(TLVITEM) + MAX_BUF, MEM_COMMIT, PAGE_READWRITE);
try
lvi.iItem:= 0; //ktore item
lvi.iSubItem:= 0; //ktore subitem
lvi.mask:= LVIF_TEXT;
//zaalokowany tylko jeden buf dlatego obliczymy gdzie ma zapisac tekst
//wykorzystamy fakt że podczas wysylania komunikatu buf na tekst jest przekazywany
//zaraz za strukturą a wiec podamy taki adres
lvi.pszText:= Pointer(Integer(pItem) + SizeOf(TLVITEM));
lvi.cchTextMax:= MAX_BUF;
//zapisz dane ze striuktury lvi do zaalokowanej pamieci
WriteProcessMemory(hProcess, pItem, @lvi, SizeOf(lvi), dCount);
//wyslij komunikat aby pobrac tekst
SendMessage(hListView, LVM_GETITEM, 0, Integer(pItem));
//odczytaj pobrany tekst do lokalnego buffera a wiec czytamy z pod
//adresu zaalokowanej pamieci + rozmiar struktury TLVITEM
ReadProcessMemory(hProcess, Pointer(Integer(pItem) + SizeOf(TLVITEM)), @buf, MAX_BUF, dCount);
finally
//zwolnij pamiec
VirtualFreeEx(hProcess, pItem, 0, MEM_RELEASE);
end;
ShowMessage(buf); //Pokaż co masz
CloseHandle(hProcess); //zamknij uchwyt procesu
end;
end;
end;
PS: Mogłem się bardziej postarać o sprawdzanie czy dane funkcje się powiodły, obsługę błędów ale to tylko kod testowy.