Autor Beitrag
Yasso
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: Do 19.08.04 23:08 
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????

www.datavis.ch/Thoma...phi/GrabListView.zip


Danke
Yasso

_________________
Yasso
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Fr 20.08.04 09:43 
Hallo!

Yasso hat folgendes geschrieben:
Aber das Lesen von Text gibt immer eine Fehlermeldung.

Und wie lautet die Fehlermeldung?

Gruß
Tino
Yasso Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: 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
Yasso Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: 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

_________________
Yasso
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Suche im MSDN WRITEPROCESSMEMORY und kopier ihn mit Suche im MSDN READPROCESSMEMORY in eine identische Struktur in den Adressraum deines Prozesses. Wie das genau geht kannst du dir bei meinen LuckieDIPS ( programme.luckie-online.de ) ankucken.
Yasso Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: 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
Yasso Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: 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
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 20.08.04 15:56 
Auf tommie-lie warten, der hat meine LuckieDIPS auch für Win9x erweitert. Oder kuck dir mal NicoDIPS an: www.luckie-online.de...nloads/Importe/Nico/
toms
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1099
Erhaltene Danke: 2



BeitragVerfasst: Fr 20.08.04 16:06 
Zitat:
www.datavis.ch/Thoma...phi/GrabListView.zip


Sorry, meine Page ist leider nicht mehr in Betrieb.
Hier findest du die Datei:
home.foni.net/~winte...ad/PrcMemMgrTest.zip
Yasso Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: Fr 20.08.04 21:04 
IHR SEID DIE BESTEN.

Alles funktioniert sehr gut

DANKE

Yasso

_________________
Yasso