Hooking einer "protected" Methode.
Vor kurzem stand ich vor dem Problem eine function zu überschreiben welche zum einen als protected deklariert ist, zum anderen nicht virtual war. Ich konnte also, nicht einfach eine abgeleitete Klasse schreiben. Der erste Gedanke fiel auf Delphi Detours Library von Mahdi Safsafi, zu finden unter https://github.com/MahdiSafsafi/delphi-detours-libraryDas Framework ist erste Wahl bei Tests und div. Tricksereien. Im folgenden Beispiel, sieht man wie die Methode TAzureBlobService.XMsDate gehookt wird. XMsDate ist ein protected Member von TAzureService. Zum Testen wollte ich den Result mit einem eigenen String überschreiben. Nötig für die Methode ListContainer der TAzureBlobService Klasse.
...
uses
DDetours,
...
TMyBlobService = class(TAzureBlobService)
public
function InterceptXMsDate: string;
function ListContainers(): TArray; overload;
end;
...
{ TMyBlobService }
function TMyBlobService.InterceptXMsDate: string;
begin
Result := FormatDateTime('ddd, dd mmm yyyy hh:nn:ss "GMT"',
TTimeZone.Local.ToUniversalTime(Now),
TFormatSettings.Create('en-US'));
end;
function TMyBlobService.ListContainers: TArray;
var
Inter: Pointer;
nextmarker: string;
ResponseXML: string;
begin
Inter := InterceptCreate(@TAzureBlobService.XMsDate, @TMyBlobService.InterceptXMsDate);
try
Result := ListContainers(False, '', nextmarker, -1, nextmarker, ResponseXML, nil);
finally
InterceptRemove(Inter);
end;
end;
...
Jetzt ist es möglich den Result der Methode anzupassen.
Kommentare
Kommentar veröffentlichen