| Autor |
Beitrag |
Rool
      
Beiträge: 211
|
Verfasst: Fr 27.12.02 12:23
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.
_________________ MFG Rool
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Fr 27.12.02 12: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
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: Fr 27.12.02 12:55
Versuch es mal so:
Quelltext 1:
| SendMessage(hListView, LVM_GETITEMTEXT, i, @Item); |
Gruß
TINO
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Fr 27.12.02 12: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:
www.luckie-online.de...rials/listview.shtml
Cu,
Udontknow
|
|
Rool 
      
Beiträge: 211
|
Verfasst: Fr 27.12.02 13: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...
_________________ MFG Rool
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 27.12.02 13: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.
|
|
|