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:
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 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. .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 |