Makros und Programme einsetzen

DLL-Funktionen aufrufen

Top  Previous  Next

Durch die Deklaration mit DllProc können Sie von TurboPL aus eine Funktion in einer DLL (Dynamic Link Library) aufrufen. Dies ist in einigen Fällen nützlich:

Wenn Sie eine Windows-Funktion benutzen möchten, für die es in TurboPL kein Äquivalent gibt. Ein Großteil der Windows-Funktionen sind in DLLs enthalten.
Wenn Sie selbst eine komplexe Funktion in einer anderen Programmiersprache schreiben wollen (z.B. Delphi, C++) und diese dann von TurboPL aus aufrufen.
Wenn Sie von einem Dritthersteller eine DLL erhalten, um z.B. Geräte wie Telefonanlagen u.ä. anzusprechen.

Damit TurboPL eine Funktion aus einer DLL aufrufen kann, muss es die folgenden Informationen haben:

1.Den Namen der DLL
2.Den Namen der Funktion
3.Die Datentypen für die Parameter und den Rückgabewert der Funktion.

Außerdem müssen die Funktionen in der DLL nach aktuellem Windows-Standard als stdcall deklariert sein.

Die benötigten Informationen erhält TurboPL durch eine spezielle Deklaration der DLL-Funktion als TurboPL-Prozedur mit dllproc. Ein Beispiel:

dllproc MyDllFunction(AString: String; var AInteger: Integer; AReal: Real): Integer library 'MyDll.dll';

Einige Standard-Typen von TurboPL werden automatisch auf typische DLL-Funktions-Typen abgebildet. Wo das nicht möglich ist und wo der Automatismus nicht passt, kann man den Datentypen der DLL explizit angeben:

dllproc MyDllFunction(AString: String as LPStr; var AInteger: Integer as I8; AReal: Real): Integer as I2 library 'MyDll.dll';

Dabei steht die Bezeichnung hinter dem as jeweils für den entsprechenden Datentyp in der DLL. In der folgenden Liste wird erklärt, welche DLL-Datentypen definiert werden können:

TurboPL

Bezeichnung

Erklärung

Typen in C und C++

Typen in Delphi

Benötigter TurboPL Typ

Standard

LPStr

ANSI-codierte Zeichenkette

LPSTR, LPCSTR, char*

PChar, PAnsiChar

String

 

LPWStr

Unicode-codierte Zeichenkette

LPWSTR, LPCWSTR, wchar_t*

PWideChar

String

X

I1

Ein-Byte Integer

signed char, char

ShortInt, Byte

Integer

 

I2

Zwei-Byte Integer

short int, unsigned short int, WORD

SmallInt

Integer

 

I4

Vier-Byte Integer

int, long, DWORD

LongInt, Integer

Integer

X

I8

Acht-Byte Integer

__int64

Int64

Integer

 

R8

Acht-Byte Real

double

Double

Real

X

Die Datentypen in TurboPL und die Datentypen in der DLL müssen natürlich zusammenpassen. Zum Beispiel kann TurboPL keinen String-Parameter als I4-Parameter an die DLL-Funktion übergeben. In der obigen Tabellen sehen Sie deshalb auch, welchen TurboPL-Typ sie für jeden der möglichen DLL-Datentypen einsetzen müssen. Ein Kreuz in der Spalte Standard zeigt an, dass ohne die Klausel mit as dieser DLL-Typ angenommen wird, wenn in der dllproc-Deklaration der entsprechende TurboPL-Typ eingetragen ist.

Andere DLL-Datentypen als die in der Tabelle eingetragenen sind in DLL-Funktionen derzeit nicht möglich.

Wichtiger Hinweis:

Ab der Version 4 werden Strings Standard-mäßig als Unicode-Zeichenketten an die DLL übergeben, während sie bis einschließlich Version 3 als ANSI-Zeichenketten betrachtet wurden. Sie müssen also vorhandenen Code ändern, damit er weiter funktioniert. Dafür gibt es zwei Möglichkeiten:

1.Sie ergänzen ein as LPStr bei den String-Parametern der dllproc-Deklaration. Dadurch ist das alte Verhalten wiederhergestellt.
2.Sie verwenden einen Unicode-String in der DLL. Falls es sich bei der DLL-Funktion um eine Windows-Funktion handelt ist das einfach. Sie geben einfach die Variante mit dem W am Ende des Namens an statt die Variante mit dem A. Dies wird auch im folgenden Beispiel gezeigt.

Beispiel:

Wem die TurboPL-Funktion Execute nicht genug Optionen bietet, der kann auch die Windows-Funktion selbst aufrufen. Beachten Sie, dass die Version für Unicode (wide string) mit dem W am Ende des Namens verwendet wird:

dllproc ShellExecuteW(hWnd: Integer; lpOperation: String; lpFile: String; lpParameters: String; lpDirectory: String; nShowCmd: Integer): Integer Library 'shell32.dll';

procedure ZeichenprogrammAufrufen

ShellExecuteW(0, "", "c:\winnt\system32\mspaint.exe", "s:\emsdemo01.jpg", "", 5);

endproc

Die folgende Variante funktioniert ebenfalls, führt aber dazu, dass alle Strings in ANSI übergeben werden und deshalb evtl. Schwierigkeiten mit Sonderzeichen aus fremden Sprachen entstehen:

dllproc ShellExecuteA(hWnd: Integer; lpOperation: String as LPStr; lpFile: String as LPStr; lpParameters: String as LPStr; lpDirectory: String as LPStr; nShowCmd: Integer): Integer Library 'shell32.dll';

Siehe auch:

DllProc