Tekst item'a obcej aplikacji

0

Witam,mam taki o to problem :
Chcę pobrać tekst itemów oraz kolumn ListView ,na początek zabrałem się za itemy i teraz powstaje problem , a mianowicie nie mogę za choinkę pobrać tego tekstu próbowałem kilka przykładów i własnych dzieł lecz jak można się domyślić nie chodziły.Zarówno taki kod nie działa(przerobiony kod kAzek'a) :

var
  hFileMapping: Cardinal;
  pItem: Pointer;
  pcol: TLVITEM;
  i: integer;
begin
  i := 0;

  hFileMapping:= CreateFileMapping($FFFFFFFF, nil,
     PAGE_READWRITE, 0, SizeOf(TLVITEM) + maxtext, nil);
  if hFileMapping = 0 then exit;
  pItem:= MapViewOfFile(hFileMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);
  if pItem = nil then
  begin
    CloseHandle(hFileMapping);
    exit;
  end;
  ZeroMemory(pItem, SizeOf(TLVITEM) + maxtext);

  pcol.mask:= LVIF_TEXT;
  pcol.cchTextMax:= maxtext;
  pcol.iSubItem:= 1;
  pcol.pszText:= PChar(pItem) + SizeOf(TLVITEM);

 
    CopyMemory(pItem, @pcol, SizeOf(TLVITEM));
 
    SendMessage(67124, LVM_GETITEM, i, LONGINT(pItem));
    ShowMessage(PChar(pItem) + SizeOf(TLVITEM));
  UnmapViewOfFile(pItem);
  CloseHandle(hFileMapping);
end;

Jak i taki :

var
  lvi: TLVITEM;
  text : pchar;
begin
  lvi.iItem := 0;
  lvi.iSubItem := 1;
  lvi.mask := LVIF_TEXT;
  lvi.pszText := @text;
  lvi.cchTextMax := 1000;

  SendMessage(198200, LVM_GETITEM, 0, Integer(@lvi));
  ShowMessage(text);

Prosiłbym o jakieś działające przykłady lub poprawę kodów ogólnie za jakiekolwiek informacje dziękuję.

PS. Nie chodzi o adresy ,są poprawne.

0

Jak rozumiem, mam zgadnąć, jaki wyskakuje Ci błąd ?

PS:

 ShowMessage(PChar(pItem) + SizeOf(TLVITEM));

Polecam poczytać o tej procedurce.
A tak ode mnie:
PChar(pItem) - Do parametru ShowMessage podaje się String.
SizeOf(TLVItem) - Jak już coś to IntToStr(SizeOf(TLVItem)), ale jak dla mnie to i tak nie ma sensu.

0

W pierwszym zwraca pustkę ,a w drugim takie krzaczki : S‹Ř‹ĂčfĚ

0

Wiem ,że muszę załadować biblioteki user32 i kernel i wykonać wysyłanie komunikatów w takim schemacie :

  1. VirtualAllocEx
  2. WriteProcessMemory
  3. SendMessage(hwnd, LVM_GETITEM, WPARAM, LPARAM)
  4. ReadProcessMemory
  5. VirtualFreeEx

Lecz nie wiem jak zrobić to z 1,2,4,5 podpunktem ,żeby wszystko grało spójnie i proszę o jakiekolwiek informacje.

0

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.

0

Wszystko pięknie gra ,za pomoc ogromnie dziękuję.

1 użytkowników online, w tym zalogowanych: 0, gości: 1