AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dll schnittstelle ohne ShareMem

Ein Thema von Blamaster · begonnen am 10. Nov 2014 · letzter Beitrag vom 11. Nov 2014
Antwort Antwort
Seite 1 von 2  1 2      
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#1

Dll schnittstelle ohne ShareMem

  Alt 10. Nov 2014, 15:54
Delphi-Version: 7
Hi,

ich möchte eine unabhängige Dll Schnittstelle implementieren. Für ein Delphi Programm sollen also Dlls mit nahezu jeder Sprache erstellt werden können. Dadurch fällt die Verwendung von ShareMem oder FastMM flach.

Daher suche ich nun nach einer Lösung das ganze ohne Delphis hauseigenen Memorymanager umzusetzen.

Dabei gibt es nun wenn ich es bisher richtig gesehen habe zwei Möglichkeiten. Entweder die Verwendung von Pchar bei der man sich selber um die allokation/deallokation kümmern muss, sowie um einen Mechanismus um die passenden Speichergrößen zu reservieren.

Eine andere Möglichkeit ist die Verwendung von WideString was dann praktisch auf den COM Speichermanager hinaus läuft (OleAut32.dll).

Erstmal hörte sich nun die Verwendung von WideString als eine ziemlich gute Idee an. Allerdings habe ich nun gelesen das es da seitens Delphi eventuell zu problemen kommen kann.

Konkret möchte ich in meinem Programm folgende Funktion aus einer DLL die in beliebiger Sprache erstellt wurde einbinden:
function getParam(): WideString; stdcall; Problem ist wohl das Delphi den Rückgabewert als In/Out implementiert hat und sich das mit den meisten anderen Sprachen beißt in denen der Rückgabewert einer Funktion als reiner Out Parameter implementiert wird. (Access violation)

Sehe ich es nun richtig das ich um dieses Problem generell komplett zu umgehen lediglich auf den Rückgabewert WideString verzichten muss und das Ergebnis über einen var Parameter zurückgeben ?
procedure getParam(var resuString: WideString); stdcall;

Gruß und Dank
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Dll schnittstelle ohne ShareMem

  Alt 10. Nov 2014, 16:47
Ja!
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Dll schnittstelle ohne ShareMem

  Alt 10. Nov 2014, 17:34
Allerdings sollte es trotzdem eine Funktion sein, die dann einen entsprechend sinnvollen Rückgabewert zurückliefert (siehe Windows API).

Dann kann man auch so eine schöne Funktion bauen, die automatisch die Fehler wirft:
Delphi-Quellcode:
type
  EFooApiException = class( Exception );

function GetFooApiErrorMessage( ErrorCode : ) : string;
begin
  Result := ...
end;

procedure CheckFooApi( AResult : Integer );
begin
  if AResult <> 0 then
    raise EFooApiException.Create( GetFooApiErrorMessage( AResult ) );
end;
Natürlich liegt die Verantwortung dafür beim Konsument der DLL, es macht sich aber immer gut, wenn diese entsprechend gut strukturiert ist.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Dll schnittstelle ohne ShareMem

  Alt 10. Nov 2014, 18:08
Wie ist das eigentlich mit dem Exception-Handling in anderen Sprachen?

Kommen die überhaupt mit den Delphi-Exceptions klar? (siehe CheckFooApi)
Daß es eine Exceptions ist, werden die bestimmt mitbekommen, aber auch mit dem Typ "EFooApiException" und dessen Message?
$2B or not $2B
  Mit Zitat antworten Zitat
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#5

AW: Dll schnittstelle ohne ShareMem

  Alt 10. Nov 2014, 18:21
Vielen Dank für die Antwort.

Eine weitere Frage kam mir noch auf. Mein Programm gibt ja sozusagen die Schnittstelle nach außen vor an die sich dann entwickler der Dll´s in beliebigen Sprachen halten müssen.

Welche Datentypen soll/kann man verwenden um eine kompatiblität mit anderen Sprachen sicher zu stellen ?

Momentan verwende ich WideString, Integer, Boolean

Delphi WideString sollte ja in den C-Varianten BSTR sein ?
Delphi Integer sollte ja in den C-Varianten int sein ?

Bei boolean bin ich mir noch weniger sicher. Sollte man das Delphi boolean in seiner Programmimplementierung bei dem gewünschten Ziel verwenden ? Es gibt ja auch noch ByteBool, WordBool und LongBool. In C wäre boolean ja auch wieder int und sollte somit 32bit enstprechen.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Dll schnittstelle ohne ShareMem

  Alt 10. Nov 2014, 18:39
Wie ist das eigentlich mit dem Exception-Handling in anderen Sprachen?

Kommen die überhaupt mit den Delphi-Exceptions klar? (siehe CheckFooApi)
Daß es eine Exceptions ist, werden die bestimmt mitbekommen, aber auch mit dem Typ "EFooApiException" und dessen Message?
Nein, und warum sollten die auch, denn die DLL wirft ja keine Exceptions, sondern (wenn so wie ich vorgeschlagen) gibt einen ResultCode zurück. Diesen Code wertet man dann aus (ein Auswertungsbeispiel für Delphi habe ich oben gezeigt) und reagiert dann darauf entsprechend.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
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
Benutzerbild von himitsu
himitsu

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

AW: Dll schnittstelle ohne ShareMem

  Alt 11. Nov 2014, 01:27
Nein, und warum sollten die auch,
Achso, du meinstest daß man das CheckFooApi sprachabhängig implemntiert und nicht mit als Funktion von der DLL exportiert .... Okey, wenn das so ist, dann OK.

Boolean würde ich nicht verwenden, sondern entweder LongBool (BOOL) oder ByteBool (bool), denn Boolean ist ein reiner Delphi-Typ (vielleicht noch in Borland C++ ) und die Konstanten (vorallem das True) haben ihre eigenen Werte/Definitionen.

Wenn die anderen in ihren Sprachen das Selbe machen, wie ständig im Delphi gemacht wird, dann muß es ja knallen.
if myfunc() = True then



Vorallem die C-Sprachen und die WinAPI nutzen BOOL, welches intern ein INT (Integer) ist und oft mit 0 und -1 befüllt wird (Delphi-Boolean-True = 1)
$2B or not $2B

Geändert von himitsu (11. Nov 2014 um 01:30 Uhr)
  Mit Zitat antworten Zitat
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#9

AW: Dll schnittstelle ohne ShareMem

  Alt 11. Nov 2014, 09:19
Okay super das C / Windows-API BOOL entspricht dann dem LongBool oder dem WordBool ?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#10

AW: Dll schnittstelle ohne ShareMem

  Alt 11. Nov 2014, 09:28
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
Zitat:
BOOL

A Boolean variable (should be TRUE or FALSE).

This type is declared in WinDef.h as follows:

typedef int BOOL;


BOOLEAN

A Boolean variable (should be TRUE or FALSE).

This type is declared in WinNT.h as follows:

typedef BYTE BOOLEAN;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:02 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz