Entwickler-Ecke
Sonstiges (Delphi) - Fehler bei Sendmessage-Parameter
Rool - Fr 27.12.02 13:23
Titel: Fehler bei Sendmessage-Parameter
ich habe diesen code, um die Items vom Desktop auszulesen. GetDesktopListViewHandle ist ne Funktion, die bereits funktioniert. In VB kann man der Sendmessage-Funktion jetzt einfach, wie ich es hier gemacht habe, als Parameter ein Record vom Typ TLVItem übergeben. In Delphi meckert er dann, was soll ich machen??
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| var Res: LRESULT; Item: TLVItem; i, lListItemCount: Integer; hListView: THandle; begin hListView:=GetDesktopListViewHandle;
lListItemCount := SendMessage(hListView, LVM_GETITEMCOUNT, 0, 0);
for i:= 0 to lListItemCount - 1 do begin SendMessage(hListView, LVM_GETITEMTEXT, i, Item); //Hier ist der fehler! ListBox1.items.Add(lvitem.sText); end; |
(27.12. 12:54 Tino) Code-Tags hinzugefügt.
Udontknow - Fr 27.12.02 13:37
Hi!
Versuche gerade, das mal nachzuvollziehen.
In welcher Unit ist denn eigentlich die Klasse TLVItem deklariert?
Du versuchst dort einen Pointer bzw ein Objekt als Integerwert zu übergeben (lParam). Caste es einfach mal als Integer, allerdings solltest du vorher evtl. ein Objekt LVItem erstellen...
Cu,
Udontknow
Tino - Fr 27.12.02 13:55
Versuch es mal so:
Quelltext
1:
| SendMessage(hListView, LVM_GETITEMTEXT, i, @Item); |
Gruß
TINO
Udontknow - Fr 27.12.02 13:59
Stelle gerade fest, dass TLVItem ein Packed Record ist, du musst also, wie Tino schon andeutet, einen Zeiger auf den Record übergeben:
Quelltext
1:
| SendMessage(hListView, LVM_GETITEMTEXT, i, Integer(@Item)); |
Luckie´s Seiten sind da recht informativ:
http://www.luckie-online.de/delphi/tutorials/listview.shtml
Cu, :)
Udontknow
Rool - Fr 27.12.02 14:33
Titel: Programmabsturz beim auslesen
Danke, bei meinen eigenen Listviews funzt alles wunderbar, aber sobald ich ein fremdes Programm nehme, stürzt es knallhart jedesmal ab! auch beim Desktop (ist ja ein Listview). Da stürzt dann der Explorer ab!
lListItemCount := SendMessage(HWND, LVM_GETITEMCOUNT, 0, 0);
Das funktioniert immer noch, aber sobald ich dann anfange, auszulesen, ist nix mehr zu retten!
Hoffentlich könnt ihr mir helfen...
Delete - Fr 27.12.02 14:49
Logisch.
Bei Windows-Controlls die noch aus der 16-Bit Windows-Zeit stammen (Edits, Listboxen, Komboboxen) kann man es noch machen. Weil es zu 16-Bit Windows möglich war und Microosft die Kompatibilität älterer Programme gewährleisten wollte. Da werden Nachrichten wie LB_GETTEXT in einen Speicherbereich gemappt, der auch anderen Prozessen zur Verfügung steht. Bei den neuen Controlls (der Listview ist so einer), hat Micorsoft keine Rücksicht daraufgenommen, weil es die zur 16-Bit Zeit in der Form noch nicht gab. Das heißt, alte Controlls kann man so auslesen, als ob sie zum eigenen Prozess gehören. Bei den neuen 32-Bit Controlls mußt du über eine DLL gehen, die man in den fremden Prozess injeziert. Das ist etwas kompliziert und nicht einfach zu bewerkstelligen.
Aber gerade für den Listview gibt es eine Unit "GrabListView". Kuck mal bei Torry oder such mir Google.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!