Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.263 Beiträge
 
Delphi 12 Athens
 
#7

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

  Alt 23. Okt 2012, 08:48
Delphi-Quellcode:
begin
  if hSchnellstartleiste = 0 then
    Exit('[Error]');
  hProc := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE,false,PID_TaskBar);
  if hProc = 0 then
    Exit('[Error:OpenProcess] ' + SysErrorMessage(GetLastError));
  ItemGlob := VirtualAllocEx(hProc, nil, SizeOf(InfoStruc) + SizeOf(Buffer), MEM_RESERVE or MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);
  if ItemGlob = nil then
    Exit('[Error:VirtualAlloc] ' + SysErrorMessage(GetLastError));
  try
    FillChar(InfoStruc, SizeOf(InfoStruc)); // *1
    with InfoStruc do
    begin
      InfoStruc.cbSize := SizeOf(InfoStruc);
      InfoStruc.dwMask := TBIF_TEXT;
      pszText := IntPtr(ItemGlob) + SizeOf(InfoStruc);
      cchText := SizeOf(Buffer);
    end;
    if not WriteProcessMemory(hProc, ItemGlob, @InfoStruc, SizeOf(InfoStruc), bw) then // *3
      Exit('[Error:WriteProcessMemory] ' + SysErrorMessage(GetLastError));
    SetLastError(0); // *4
    R := SendMessage(hSchnellstartleiste, TB_GETBUTTONINFO, idCommand, LPARAM(ItemGlob));
    if (L = 0) or (GetLastError <> 0) then
      Exit('[Error:SendMessage] ' + SysErrorMessage(GetLastError));
    if not ReadProcessMemory(hProc, Pointer(IntPtr(ItemGlob) + SizeOf(InfoStruc)), @Buffer[0], SizeOf(Buffer), bw) then
      Exit('[Error:ReadProcessMemory] ' + SysErrorMessage(GetLastError));
    Result := Buffer;
  finally
    VirtualFreeEx(hProc, ItemGlob, 0, MEM_RELEASE); // *2 : If the dwFreeType parameter is MEM_RELEASE, dwSize must be 0 (zero)
    CloseHandle(hProc);
  end;
end;
*1) Soll sicherstellen, daß nichtgenutzte Teile 0 sind, damit keine unbeabsichtigten Reaktionen ausgelöst werden ... deine lokale Variable ist aber mit zuzälligem Inhalt versehn.
*2) Dokumentationen sollte man schon noch lesen.
*3) Wie gesagt, Rückgabewerte auswerten und wenn, dann ordentlich, damit man damit auch was anfangen kann.
*4) LastError wird "natürlich" nicht gesetzt, wenn der Aufruf erfolgreich war, aber aus dem Result von SendMessage kann man nicht immer direkt etwas schließen.

Das Exit(...) steht für begin Result := ''; Exit; end; .
IMHO macht es den Code teilweise übersichtlicher.
- Weniger Verschachtelungsebenen, wo man erst viel später im ELSE was finden muß. So sieht man beide Aktionen sofort. (bei Fehler raus und sonst weiter)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat