Autor Beitrag
Rool
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 211



BeitragVerfasst: 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??
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Fr 27.12.02 12:55 
Versuch es mal so:
ausblenden Quelltext
1:
SendMessage(hListView, LVM_GETITEMTEXT, i, @Item);					

Gruß
TINO
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 211



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



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