Entwickler-Ecke
Windows API - ListView_GetItemText????
Yasso - Do 19.08.04 23:08
Titel: ListView_GetItemText????
Hi,
ich suche folgende Unit 'GrabListView.Zip'.
Damit soll das Auslesen von ListView von fremden Apps möglich sein.
Ich habe es mit ListView_GetItemText, und es funktioniert nur wenn ich die Anzahl der Einträge ermitteln möchte. Aber das Lesen von Text gibt immer eine Fehlermeldung.
Weis vielleicht jemand wie?
Die Unit war auf dem folgenden Link gewesen, jetzt aber nicht mehr????
http://www.datavis.ch/Thomas/Downloads/Delphi/GrabListView.zip
Danke
Yasso
Tino - Fr 20.08.04 09:43
Titel: Re: ListView_GetItemText????
Hallo!
Yasso hat folgendes geschrieben: |
Aber das Lesen von Text gibt immer eine Fehlermeldung. |
Und wie lautet die Fehlermeldung?
Gruß
Tino
Yasso - Fr 20.08.04 10:36
Hi Tino,
Wenn ich die Einträge einer Listview der eigenen Anwendung lese, dann funktioniert es.
Sobald ich versuche die Einträe einer Listview einer anderen Anwendung zu lesen, erscheint folgende Fehlermeldung:
"Zugriffsverletzung bei Adresse BFED2034 in Modul 'COMCTL32.DLL'. Lesen von 006DF42C"
Diese Fehler trägt immer den Namen der fremden Anwendung. (Die Caption des MessageDlgs)
Man sagte mir, ich mit AllocMem Speicherplatz für TLVItem reservieren, aber es funktioniert nicht.
Ich komme leider nicht weiter.
Danke
Yasso
Yasso - Fr 20.08.04 11:22
hi,
hier das Soucecode, das ich nutze (habe ich von anderen übernommen).
type
TForeignListItems = class
private
FHandle: THandle;
function GetCount: Integer;
function GetItems(Index: Integer): string;
function GetSubItems(Index, Column: Integer): string;
public
constructor Create(Handle: hWnd);
property Count: Integer read GetCount;
property Handle: THandle read FHandle;
property Items[Index: Integer]: string read GetItems;default;
property SubItems[Index, Column: Integer]: string read GetSubItems;
end;
implementation
{ TForeignListItems }
constructor TForeignListItems.Create(Handle: hWnd);
begin
inherited Create;
FHandle:=Handle;
end;
function TForeignListItems.GetCount: Integer;
begin
Result:=ListView_GetItemCount(Handle);
end;
function TForeignListItems.GetItems(Index: Integer): string;
begin
Result:=GetSubItems(Index,-1);
end;
function TForeignListItems.GetSubItems(Index, Column: Integer): string;
var
Buffer: array[0..255] of Char;
Len: Integer;
begin
Len:=ListView_GetItemText(Handle,Index,Column+1,Buffer,256);
SetLength(Result,Len);
Move(Buffer,PChar(Result)^,Len);
end;
...
var
Temp: TForeignListItems;
I: Integer;
begin
Temp:=TForeignListItems.Create(Handle); //Handle ist das Handle einer ListView
try
Label1.caption := Temp.Items[0]; //erster Eintrag wird gezeigt
finally
Temp.Free;
end;
end;
Danke
Yasso
Delete - Fr 20.08.04 13:48
OK, zum was waeiß ich wie vielten Male:
Der Listview gehört zu den neuen 32-Bit Steuerelemten (Commoncontrols). Das vor weg. Früher, unter 16-Bit Windows, waren die Speicherbereiche der Prozesse noch nicht getrennt, das heißt, ich konnte ohne weiteres auf den Speicherbereich eines anderen Prozesses ohne weiteres zugreifen. Mircosoft hat, aus Kompatibilitätsgrunden, dieses Verhalten auch unter 32-Bit Windows für die damals schon vorhandenen und unter 32-Bit Windows immer noch vorhandenen Kontrolls implememntiert. Aufrufe wie WM_GETTEXT für Edit-felder usw. werden dazu in einen gemeinsamen Speicherbereich gemappt. Für die neu hinzugekommen Kontrolls (Listview, Treeview, Satatusbar, ...) sah Microsoft diese Notwendigkeit nicht. Da Listview_Gettext eigentlich nur einen Zeiger auf einen Buffer zurückliefert, schlägt logischerweise dieser Aufruf fehl, wenn es sich um einen Listview in einem fremden Prozess handelt. Listview_GetItemCount funktioniert, da der konkrete Wert zurückgeliefert wird und kein Zeiger auf einen Buffer.
Lösung: Reserviere Speicher im fremden Prozess, fülle ihn mit
WRITEPROCESSMEMORY und kopier ihn mit
READPROCESSMEMORY in eine identische Struktur in den Adressraum deines Prozesses. Wie das genau geht kannst du dir bei meinen LuckieDIPS (
http://programme.luckie-online.de ) ankucken.
Yasso - Fr 20.08.04 15:10
Hi Luckie,
soweit gut, aber doch noch ein Problem.
Und zwar die Funktion 'VirtualAllocEx' liefert immer ein 'NIL'
?????
Danke
Yasso
Yasso - Fr 20.08.04 15:48
Hi,
Rückgabewert der Funktion VirtualAllocEx ist immer 'NIL', weil ich wahrscheinlich Win98 habe und kein NT????????? ist das richtig????
wenn JA, was TUN???
Danke
Yasso
Yasso - Fr 20.08.04 21:04
IHR SEID DIE BESTEN.
Alles funktioniert sehr gut
DANKE
Yasso
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!