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:
Damit TurboPL eine Funktion aus einer DLL aufrufen kann, muss es die folgenden Informationen haben:
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:
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:
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: |