Autor Beitrag
NewMori
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45
Erhaltene Danke: 1



BeitragVerfasst: Mi 20.07.11 00:06 
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.

ausblenden volle Höhe Delphi-Quelltext
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, 00);
  SetLength(DeskIcos,ItemsCount);

  ZeroMemory(@LVI,SizeOf(LVI));                                   //Init LVI
  lvi.cchTextMax := SizeOf(TCharArray)-1;
  lvi.iSubItem   :=0;
  lvi.pszText    := Pointer(RemText);
  WriteToRemoteBuffer(@LVI, Pointer(RemLVI), SizeOf(LVI));         //Sync LVI and RemLVI

  for i:=0 to ItemsCount-1 do
  begin
    nb := SendMessage(LVH, LVM_GETITEMTEXT, i, LParam(RemLVI));   //Get Text <-- Hier ist der fehlerhafte Aufruf
    if nb=0 then RaiseLastWin32Error();
    ReadRemoteBuffer(Pointer(RemText), @Text, nb+1);              //Sync Text and RemText

    FillChar(Apoint, SizeOf(Apoint), 0);                          //Reset Point
    WriteToRemoteBuffer(@APoint, Pointer(RemPoint), SizeOf(APoint));      //Sync Point and RemPoint
    SendMessage(LVH, LVM_GETITEMPOSITION, i, Integer(RemPoint));  //Get PointData
    ReadRemoteBuffer(Pointer(RemPoint), @Apoint, SizeOf(Apoint)); //Sync Point and RemPoint

    WriteLn(Text+' - '+Inttostr(APoint.X)+'-'+Inttostr(APoint.Y));//Write
    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.