Delphi beherrscht verschiedene Aufrufkonventionen.
Aus
function getParam(idx:Integer): WideString; safecall; // man beachte das safecall
erzeugt der Delphi Compiler
function getParam(idx:Integer; out Result:WideString): HResult; stdcall;
Eine
Exception innerhalb der Funktion bewirkt automatisch, dass das HResult <> S_OK und der
ActiveX-Client die
Exception-Message über bestimmte Interfaces (ISupportErrorInfo und IErrorInfo) abrufen kann.
Man darf allerdings nicht jede beliebige Exceptionklasse verwenden sondern nur EOleSysError oder EOleException und alles was davon noch abgeleitet ist.
Umgekehrt wird bei jeder Funktion die mit der safecall-Konvention importiert wurde das HResult geprüft und ggf. eine
Exception innerhalb der
VCL mit der korrekten
Exception-Message ausgelöst (diesmal ist die Delphi Anwendung der Client).
Safecall ist also ein Mechanismus mit dem
Exception-Informationen zwischen
ActiveX Server und Client ausgetauscht werden.
Funktionen, die eine Exceptioninformation über die Grenzen transportieren sollen müssen grundsätzlich ein HResult zurückgeben.
Man kann aber jederzeit auf safecall verzichten und seine Funktionen nach der stdcall-Konvention exportieren.
Da aber alle aktuellen
ActiveX-Clients diesen "Trick" mit den Interfaces ISupportErrorInfo und IErrorInfo beherrschen und insbesondere Scriptsprachen darauf angewiesen sind würde ich empfehlen alle Funktionen mit safecall zu deklarieren und ausserdem sog. Dual Interfaces zu verwenden.
Dann kann deine Bibliothek von Scriptsprachen (late binding über IDispatch) als auch über early binding angesprochen werden.
PS: wenn du etwas spielen möchtest kannst du das "
ActiveX Starterkit" runterladen.
https://github.com/sx2008/Delphi-Tes...iveXStarterKit
Es zeigt wie man eine Anwendung erstellt die von einem VB-Script festgesteuert wird.