2008-09-18 4 views
16

Ich arbeite an der Erstellung eines ActiveX-EXE mit VB6, und das einzige Beispiel, das ich bekam, ist alles in Delphi geschrieben.Was ist Safecall?

Als ich den Beispielcode las, bemerkte ich, dass es einige Funktionen gibt, auf deren Signaturen das Schlüsselwort Safecall folgt. Hier ein Beispiel:

function AddSymbol(ASymbol: OleVariant): WordBool; safecall; 

Was ist der Zweck dieses Schlüsselworts?

+0

Antwort

14

Safecall gibt Parameter von rechts nach links anstelle des pascal oder registrieren (default) von links nach rechts

Mit Safecall, die Prozedur oder Funktion entfernt Parameter aus dem Stapel auf (wie pascal zurückkehrt, aber nicht wie cdecl, wo es an den Anrufer geht)

Safecall implementiert Ausnahme "Firewalls"; esp auf Win32 implementiert das Interprozess COM-Fehlerbenachrichtigung. Es wäre sonst identisch mit stdcall (die andere Aufruf Konvention mit dem Win-API verwendet)

3

What Francois said und wenn es nicht für SafeCall wäre Ihre COM-Methode Anruf hätte wie unten aussehen würde und Sie müssten Ihre eigenen Fehler überprüfen anstatt Ausnahmen zu bekommen.

function AddSymbol(ASymbol: OleVariant; out Result: WordBool): HResult; stdcall; 
14

Zusätzlich ist die Ausnahme Firewalls durch den Aufruf SetErrorInfo() mit einem Objekt, das IErrorInfo unterstützt, so dass die Anrufer erweiterten Information über die Ausnahme bekommen. Dies geschieht durch die TObject.SafeCallException-Überschreibung in TComObject und TAutoIntfObject. Beide Typen implementieren auch ISupportErrorInfo, um diese Tatsache zu markieren. Im Fall einer Ausnahme kann der Aufrufer der safecall-Methode ISupportErrorInfo abfragen und dann das für die Schnittstelle abfragen, dessen Methode zu einem Fehler HRESULT (high bit set) geführt hat. Wenn dies S_OK zurückgibt, kann GetErrorInfo() die Ausnahme erhalten info (Beschreibung, Hilfe usw. in Form der IErrorInfo-Implementierung, die von Delphi RTL in den SafeCallException-Überschreibungen an SetErrorInfo() übergeben wurde).