Wenn es um die Funktion selber geht.
Das Original sieht so aus.
Delphi-Quellcode:
procedure _IntfCast(
var Dest: IInterface;
const Source: IInterface;
const IID: TGUID);
{$IFDEF PUREPASCAL}
// PIC: EBX must be correct before calling QueryInterface
var
Temp: IInterface;
begin
if Source =
nil then
Dest :=
nil
else
begin
Temp :=
nil;
if Source.QueryInterface(IID, Temp) <> 0
then
Error(reIntfCastError)
else
Dest := Temp;
end;
end;
{$ELSE}
asm
TEST EDX,EDX
JE _IntfClear
PUSH EDI
MOV EDI, EAX
// ptr to dest
PUSH 0
PUSH ESP
// ptr to temp
PUSH ECX
// ptr to GUID
PUSH EDX
// ptr to source
@@1: MOV EAX,[EDX]
CALL DWORD PTR [EAX] + VMTOFFSET IInterface.QueryInterface
TEST EAX,EAX
JE @@2
MOV AL,reIntfCastError
... tausende weitere Zeilen
Und wie man sieht, bekommt man dann nur die Meldung "Interface nicht unterstützt" und sonst weiß man garnicht welches und wo.
Mein Code gibt erstmal die entsprechende
GUID des Interfaces aus, welches angefragt wurde.
Damit hat man schonmal einen Anhaltspunkt.
Zusätzlich wird die ganze
RTTI durchsucht, ob interfacedeklarationen vorhanden sind, davon werden nun alle (idealer Weise nur Eine) rausgesucht, welche die selbe
GUID besitzen.
Über die
RTTI kommt man nun an den Namen der Deklaration im Quellcode.
Als Weiteres wird geschaut, ob sich in dem Interface ein Delphi-TObjekt-Nachfahre befindet.
Wenn ja, dann wird dessen Klassenname mit ausgegeben, samt dem Namen
Unit. Ist es sogar ein TComponent-Nachfahre, dann eventuell auch noch dessen
VCL-Name (Name-Property).
Und bei TWinControls (sichtbaren Komponenten) wird geschaut auf welcher Form/Frame dieses liegt (Parent-Property) und die Namen dieses Form/Frame werden ebenfalls angezeigt.
Ein/Zwei Unzulänglichkeiten/Fehlende Infos sind mir noch aufgefallen, aber das hat noch'n bissl Zeit.
Es gibt einfach viele Fehlermeldungen, die zwar sagen "es geht nix", aber über das was nicht geht, wird geschwiegen.