TurboPL Referenz

dllproc Kommando

Top  Previous  Next

Syntax

dllproc Funktionsname([Funktionsparameter: Parametertyp]): [Ergebnistyp] library Dll-Dateiname

Erklärung

Definiert den Zugriff auf eine in einer Dll-Datei vorhandenen Funktion die Sie in einer anderen Programmiersprache wie z.B. C++ oder Delphi erstellt haben. Diese können danach wie die vorhandenen TurboPL-Funktionen in Modulen benutzt werden.

Wenn Sie eigene Dll-Funktionen für TurboDB Studio entwickeln wollen, müssen Sie folgende Punkte beachten:

Der Aufruf der Funktion muss als stdcall definiert sein.
Exportieren Sie Ihre Funktion unter dem Namen, den Sie unter TurboDB Studio verwenden wollen und achten Sie dabei auf die Groß/Kleinschreibung.
Real-Zahlen werden als Double übergeben, Integer-Zahlen als 32-Bit Integer und Zeichenketten als Unicode-Strings.

Achtung

Ab TurboDB Studio müssen Zeichenketten als Unicode-Strings übergeben werden, während frühere Versionen Ansi-Strings verwendet haben. Deswegen müssen Sie bei Aufrufen in Windows-Bibliotheken die Unicode-Versionen dieser Funktionen verwenden, die sich durch ein nachgestelltes W auszeichnen. Z.B. ShellExecuteW (und nicht mehr wie bei VDP 3 ShellExecuteA). Selbstgeschriebene Funktionen müssen für String-Parameter die Werte als PWideChar (Delphi), wchar_t* (C++), TCHAR*/LPCTSTR* (C++ mit Compiler-Option UNICODE) erwarten.

Beispiel

Dieser Delphi - Quelltext zeigt die prinzipielle Erstellung einer Dll und deren Verwendung mit TurboDB Studio. Die Funktionen der Dll sind bewusst einfach gehalten, um die Möglichkeiten der Parameterübergabe zu verdeutlichen.

// Delphi - Quelltext
library TurboDBStudioDemoDll;

uses

SysUtils,

StdCtrls,

Dialogs;

 

// Eine Meldung am Bildschirm ausgeben

procedure HelloWorld; stdcall; export;

begin

       ShowMessage('Hello World!');

end;

 

// Inhalt eines Strings oder Memofeldes in eine Datei schreiben

procedure WriteMemoToFile(Memo: PChar); stdcall; export;

var m: TMemo;

begin

       m := TMemo.Create(nil);

       m.Text := Memo;

       m.Lines.SaveToFile('TurboDB Studio Memo.txt');

       m.Free;

end;

 

// einen Integerwert zurückgeben

function GetIntResult: Integer; stdcall; export;

begin

       Result := 12345;

end;

 

// Übergebener Integer-Parameter wird verdoppelt

function GetIntParameter(MyParameter: Integer): Integer; stdcall; export;

begin

       Result := MyParameter * 2;

end;

 

// Übergebener Real-Parameter wird verdoppelt

function GetRealParameter(MyParameter: Double): Double; stdcall; export;

begin

       Result := MyParameter * 2;

end;

 

// Länge eines Strings bestimmen

function GetStringLen(const MyParameter: PWideChar): Integer; stdcall; export;

begin

       Result :=StrLen(MyParameter);

end;

 

// Speichergröße eines Strings bestimmen

function GetStringSize(const MyParameter: PChar): Integer; stdcall; export;

begin

       Result := sizeof(MyParameter);

end;

 

// Testen ob ein String leer ist

function IsStringEmpty(const MyParameter: PChar): Integer; stdcall; export;

begin

       if StrLen(MyParameter) = 0 then

               Result := 1

       else

               Result := 0;

end;

 

// Einen String mit Text belegen

procedure SetTurboPLString(MyParameter: PChar; MaxLen: Integer); stdcall; export;

begin

       StrPLCopy(MyParameter, 'Der dataweb TestString', MaxLen);

end;

 

// Verdoppelt übergebenen Integer-Wert

procedure SetIntParameter(var MyParameter: Integer); stdcall; export;

begin

       MyParameter := MyParameter * 2;

end;

 

// Verdoppelt übergebenen Real-Wert

procedure SetRealParameter(var MyParameter: Double);stdcall;export;

begin

       MyParameter  := MyParameter * 2;

end;

 

// Vergleicht 2 Strings unabhängig von Groß/Kleinschreibung

function StrEqual(const param1, param2: PChar): Integer; stdcall; export;

begin

       Result := StrIComp(param1, param2);

end;

 

exports

       HelloWorld index 1,

       GetIntResult index 2,

       GetIntParameter index 3,

       GetRealParameter index 4,

       SetIntParameter index 5,

       SetRealParameter index 6,

       IsStringEmpty index 7,

       GetStringLen index 8,

       GetStringSize index 9,

       StrEqual index 10,

       SetTurboPLString index 11,

       WriteMemoToFile index 12;

begin

end.

 
 
..Dieses Modul greift auf die Dll - Funktionen zu

.SV 1

 

dllproc HelloWorld  library "TurboDBStudioDemoDll.dll";

dllproc GetIntResult: Integer  library "TurboDBStudioDemoDll.dll";

 

dllproc GetIntParameter(myParam: Integer):Integer  library "TurboDBStudioDemoDll.dll";

dllproc GetRealParameter(myParam: Real): Real  library "TurboDBStudioDemoDll.dll";

 

dllproc SetIntParameter(var myParam: Integer)  library "TurboDBStudioDemoDll.dll";

dllproc SetRealParameter(var myParam: Real)  library "TurboDBStudioDemoDll.dll";

 

dllproc SetTurboPLString(var myParam: String as LPStr; maxlen: Integer)  library "TurboDBStudioDemoDll.dll";

dllproc IsStringEmpty(myParam: String as LPStr): Integer  library "TurboDBStudioDemoDll.dll";

dllproc GetStringLen(myParam: String as LPStr): Integer  library "TurboDBStudioDemoDll.dll";

dllproc GetStringSize(myParam: String as LPStr): Integer  library "TurboDBStudioDemoDll.dll";

dllproc StrEqual(Param1: String; Param2: String as LPStr): Integer  library "TurboDBStudioDemoDll.dll";

 

dllproc WriteMemoToFile(Memo: String as LPStr) library "TurboDBStudioDemoDll.dll";

 

 

procedure Hallo

HelloWorld

endproc

 

procedure IntegerResult

Message(Str(GetIntResult), "Sollte 12345 sein");

endproc

 

procedure IntegerGetTest;

Message(Str(GetIntParameter(39)));

endproc

 

procedure RealGetTest;

Message(Str(GetRealParameter(3.9),5,2));

endproc

 

procedure RealSetTest;

vardef x: Real;

x := 10.5;

SetRealParameter(x);

Message("Aufruf liefert " + Str(x,5,2) + ". Erwartet werden 21,00.");

endproc

 

procedure IntegerlSetTest;

vardef x: Integer;

x := 10;

SetIntParameter(x);

Message("Aufruf liefert " + Str(x,5,2) + ". Erwartet werden 20,00.");

endproc

 

procedure ShowEmpty(s: String);

if IsStringEmpty(s)

   Message("Der String ist leer")

else

   Message("Der String lautet: " +chr(13)+ s)

end;

endproc

 

procedure ShowEqual

vardef res: real;

res := StrEqual("aSdDfFgH", "AsDdFfGh")

if res = 0

   Message("Der String ist gleich", Str(res))

else

   Message("Der String ist ungleich", Str(res))

end;

endproc

 

procedure StringTest

vardef s: String;

s := ""

ShowEmpty(s)

s := "dhfgksldfhglsjkdhfglskdhfglks hdlfkghsdjkfhgskdlfhk"

SetTurboPLString(s, 25);

ShowEmpty(s)

endproc

 

procedure MemoToFile;

WriteMemoToFile(Tabelle.MemoFeld);

endproc