Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

AW: Delphi-System-Funktion ersetzen

  Alt 1. Mär 2012, 18:09
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.
$2B or not $2B
  Mit Zitat antworten Zitat