Hallo,
ich programmiere grade ein Tool um meinen Desktop zu verwalten. Bei MSDN und auf
www.swissdelphicente...showcode.php?id=1897 habe ich einen Weg gefunden die Icons auszulesen und zu verändern. Leider gibt mir Windows zwar die Icon Positionen aber nicht die Label der Icons welche ich später zum Verschieben ja wieder brauche. Ich habe die Funktion vom Link etwas abgeändert RemXXX ist ein mit der Explorer.exe geteilter Speicherbereich.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45:
| procedure SaveListItemPosition(LVH : THandle; RemoteAddr : Pointer); type TCharArray=array [0..MAX_PATH] of char; PCharArray=^TCharArray; var lvi : TLVITEM; Text : TCharArray; Apoint : TPoint;
nb : integer; i, ItemsCount : integer;
RemLVI:PLVITEM; RemText:PCharArray; RemPoint:PPoint; begin RemLVI:=RemoteAddr; RemText :=Pointer(Integer(RemLVI)+SizeOf(lvi)); RemPoint:=Pointer(Integer(RemText)+SizeOf(Text));
ItemsCount := SendMessage(LVH, LVM_GETITEMCOUNT, 0, 0); SetLength(DeskIcos,ItemsCount);
ZeroMemory(@LVI,SizeOf(LVI)); lvi.cchTextMax := SizeOf(TCharArray)-1; lvi.iSubItem :=0; lvi.pszText := Pointer(RemText); WriteToRemoteBuffer(@LVI, Pointer(RemLVI), SizeOf(LVI)); for i:=0 to ItemsCount-1 do begin nb := SendMessage(LVH, LVM_GETITEMTEXT, i, LParam(RemLVI)); if nb=0 then RaiseLastWin32Error(); ReadRemoteBuffer(Pointer(RemText), @Text, nb+1); FillChar(Apoint, SizeOf(Apoint), 0); WriteToRemoteBuffer(@APoint, Pointer(RemPoint), SizeOf(APoint)); SendMessage(LVH, LVM_GETITEMPOSITION, i, Integer(RemPoint)); ReadRemoteBuffer(Pointer(RemPoint), @Apoint, SizeOf(Apoint)); WriteLn(Text+' - '+Inttostr(APoint.X)+'-'+Inttostr(APoint.Y)); DeskIcos[i].Point:=APoint; DeskIcos[i].Name:=Text; end; end; |
SendMessage gibt aber immer 0 (normalerweise die String Länge) zurück und führt bei RaiseLastWin32Error dann zu "Ein Aufruf einer Betriebssystemfunktion ist fehlgeschlagen". Ich kann mir leider nicht erklären wo der Fehler liegt. Der Speicherbereich ist, meiner Meinung nach, frei und ich habe mich nach der Doku (
msdn.microsoft.com/e...55%28v=VS.85%29.aspx) gerichtet.
Ich wäre sehr dankbar wenn ihr euch den Code einmal anschauen könntet, warscheinlich ist es einen einfacher Fehler aber ich sehe ihn einfach nicht.
Es ist keine Kunst in ein Programm 20 Fehler zu schreiben. Die Kunst ist es das Programm dann noch zum laufen zu bekommen.