Einzelnen Beitrag anzeigen

Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#7

AW: Dll schnittstelle ohne ShareMem

  Alt 10. Nov 2014, 22:45
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.
fork me on Github

Geändert von sx2008 (10. Nov 2014 um 22:50 Uhr)
  Mit Zitat antworten Zitat