image2data

Der Tech-Blog

...weitermachen, wo OCR aufhört

Einbinden von DLLs

Jan 132015

Um beispielsweise den Funktionsumfang von image2data zu erweitern, gewohnte Routinen weiter verwenden zu können oder über proprietäre Schnittstellen Daten an Fremdsoftware übergeben zu können, lassen sich DLLs in i2dScript einbinden. Wie nahezu überall werden die verwendeten externen Routinen vor dem Aufruf deklariert, damit i2dScript weiss, in welchen Dateien sie unter welchem Namen zu finden sind.

In den folgenden Beispielen wird die Aufrufkonvention "stdcall" verwendet, welche den Standard im Windows-Umfeld darstellt. Alternativ findet noch die Konvention "cdecl" einige Verbreitung.

Hier die Deklaration einer externen Prozedur, die einen Integer-Parameter erwartet:

procedure ExterneProzedur1(Value: Integer); external 'ExterneProzedur1@MeineDLL.dll stdcall';

Sollen Variablen übergeben werden, so wird diesen, wie in i2dScript auch, das Wort "var" vorangestellt:

procedure ExterneProzedur2(var Value: Integer); external 'ExterneProzedur2@MeineDLL.dll stdcall';

Sollen Textparameter übergeben werden, so werden diese mit dem Datentypen "String" deklariert, obwohl es sich bei diesen, rein technisch gesehen, um Zeiger auf einen nullterminierten Char-Wert handelt:

procedure ExterneProzedur3(Value: String); external 'ExterneProzedur3@MeineDLL.dll stdcall';

Bei der Verwendung von Textvariablen müssen diese vor dem Aufruf auf die notwendige Größe dimensioniert werden, z.B. so:

type
  TChar512 = array[0..512] of Char;
 
procedure ExterneProzedur4(var Value: TChar512); external 'ExterneProzedur4@MeineDLL.dll stdcall';

Für externe Funktionen gilt dasselbe wie für Prozeduren. Hier ein Beispiel für eine Funktion, die einen Integer-Parameter erhält und einen Single-Wert als Ergebnis zurück gibt:

function ExterneFunktion1(Value: Integer): Single; external 'ExterneFunktion1@MeineDLL.dll stdcall';

Abschließend das Ganze als komplettes Skript mit Deklaration und Aufruf:

procedure ExterneProzedur1(Value: Integer); external 'ExterneProzedur1@MeineDLL.dll stdcall';
 
begin
  ExterneProzedur1(17);
end.

Hinweis: ist eine externe Routine falsch deklariert worden oder existiert die referenzierte DLL nicht, bricht die Compilierung des Skriptcodes ohne Fehlermeldung ab; das Ausgabefenster bleibt leer!

Atom

powered by Nibbleblog