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)