Einzelnen Beitrag anzeigen

r29d43

Registriert seit: 18. Jan 2007
289 Beiträge
 
Delphi 10.4 Sydney
 
#1

Toolbar-Auslesen klappt nicht auf einem 64bit-Win7?

  Alt 22. Okt 2012, 13:39
Hallo,

es geht darum, eine Toolbar (die Schnellstartleiste = QuickLaunch) auszulesen, bzw. die Caption-Texte von den Buttons darauf. Bei einem 32bit-Win7 klappte das, beim 64bit-Win7 meines neuen Laptops jetzt aber leider nicht mehr.

Das exakt gleiche Problem hatte ich auch schon beim des Auslesens eines ListView-Controls. Das allerdings konnte ich lösen, mittels eines Tipps (von teebee) aus dem Forum hier (http://www.delphipraxis.net/129414-i...vista-x64.html). Die Lösung hier lag in einem Umbau einer LVItem-Struktur von einer 32Bit-Struktur in eine 64Bit-Struktur.

Ergo versuchte ich diese Lösung 1:1 auf mein ToolBar-Problem zu übertragen, was jetzt aber leider nicht mehr funktionierte. Nach wie vor bekomme ich als Text für die Button-Captions immer wieder nur einen leeren String zurück.

Sieht event. jemand woran das liegen könnte?

Und: Ist meine TBBUTTONINFO64-Struktur auch genauso geworden, wie sie ein 64bit-System erwartet?



Delphi-Quellcode:
function TSmallIconForm.GetTBButtonText64Bit(idCommand: Integer): String;

type
  TBBUTTONINFO64 = packed record
    ewMask: DWORD;
    idCommand: Integer;
    iImage: Integer;
    fsState: Byte;
    fsStyle: Byte;
    cx: Word;
    lParam: DWORD;
// pszText: PAnsiChar;
                  _align: LongInt; // Zeiger müssen in 64-Bit-Windows an 8-Byte-Alignment beginnen
                  pszText: Int64; // Zeiger haben in 64-Bit-Windows 8 Byte
    cchText: Integer;
  end;
  PTBButtonInfo64 = ^TBButtonInfo64;

var ItemGlob: PTBButtonInfo64;
    InfoStruc: TBButtonInfo64;
    Buffer: Array[0..255] of Char;
    hProc: THandle;
    bw: Cardinal;
begin
  Result := '[Error]';
  if hSchnellstartleiste <> 0 then
  begin
    hProc := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE,false,PID_TaskBar);
    if hProc <> 0 then
    begin
      ItemGlob := VirtualAllocEx(hProc,nil,SizeOf(InfoStruc)+SizeOf(Buffer),
                                 MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);

      if ItemGlob <> nil then
      try
        with InfoStruc do
        begin
          InfoStruc.cbSize := sizeof(InfoStruc);
          InfoStruc.dwMask := TBIF_TEXT;
          pszText := Cardinal(ItemGlob)+SizeOf(InfoStruc);
          cchText := SizeOf(Buffer);
        end;

        WriteProcessMemory(hProc,ItemGlob,@InfoStruc,SizeOf(InfoStruc),bw); // parameter zum Data-Transfer: ..., "nach", "von", "länge",...
        sendMessage(hSchnellstartleiste,TB_GETBUTTONINFO,idCommand,integer(ItemGlob));
        ReadProcessMemory(hProc,Pointer(Cardinal(ItemGlob)+SizeOf(InfoStruc)), // parameter zum Data-Transfer: ..., "von", "nach", "länge",...
                          @Buffer[0],SizeOf(Buffer),bw);
        Result := Buffer;
      finally
        VirtualFreeEx(hProc,ItemGlob,SizeOf(InfoStruc)+SizeOf(Buffer),MEM_RELEASE);
        CloseHandle(hProc);
      end;
    end;
  end;
end;
  Mit Zitat antworten Zitat