Freigeben über


Zugreifen auf Dynamic-Link Libraries (DLLs)

Stehen die von Ihnen benötigten Funktionen in einer DLL zur Verfügung, können Sie diese Bibliothek einbinden und deren Funktionen aufrufen. Bevor Sie eine DLL-Funktion aufrufen, müssen Sie deren Aufrufprotokoll kennen. Dazu gehören der Name der Funktion, die Anzahl und die Datentypen ihrer Parameter sowie der Datentyp ihres Rückgabewertes.

In Visual FoxPro können Sie nur solche DLLs verwenden, die für eine 32-Bit-Umgebung geschrieben wurden. Für den Fall, dass Sie auf eine 16-Bit-DLL zugreifen müssen, können Sie auf diese über Funktionen zugreifen, die in Foxtools.fll verfügbar sind. Weitere Informationen hierzu finden Sie in der Hilfe von Foxtools (Foxtools.chm).

So rufen Sie eine DLL-Funktion auf

  1. Registrieren Sie die DLL-Funktion mit dem Befehl DECLARE - DLL. Für den Namen einer Funktion wird die Groß-/Kleinschreibung beachtet.

    Anmerkung   Wenn Sie als Bibliotheksnamen WIN32API angeben, sucht Visual FoxPro die 32-Bit-Windows-DLL-Funktion in Kernel32.dll, Gdi32.dll, User32.dll, Mpr.dll und Advapi32.dll.

  2. Rufen Sie die Funktion so wie jede normale Visual FoxPro-Funktion auf.

Im folgenden Programm wird z. B. die GetActiveWindow( )-Funktion registriert, die zu der Windows-System-DLL USER32.DLL gehört und hier das Handle des Visual FoxPro-Hauptfensters zurückgibt. Die GetActiveWindow( )-Funktion hat keine Parameter und gibt eine ganze Zahl zurück:

DECLARE INTEGER GetActiveWindow IN win32api
MESSAGEBOX(STR( GetActiveWindow() ) )

Die DLL, zu der die Funktion gehört, die Sie registrieren möchten, muss sich an einer der folgenden Stellen befinden: im Standardverzeichnis, im Verzeichnis von Windows, im Windows-Unterverzeichnis System oder entlang des DOS-Pfades.

Hat die Funktion, die Sie aufrufen möchten, denselben Namen wie eine andere Funktion, die bereits in Visual FoxPro verfügbar ist (entweder als eingebaute Funktion oder als schon deklarierte DLL-Funktion), können Sie der ersten einen Alias zuweisen und die Funktion mit diesem aufrufen.

DECLARE INTEGER GetActiveWindow IN win32api AS GetWinHndl
MESSAGEBOX(STR( GetWinHndl() ) )

Da eine eingebundene DLL-Funktion solange verfügbar bleibt, bis Sie Visual FoxPro beenden, brauchen Sie die jeweilige Funktion nur einmal pro Sitzung zu deklarieren. Wenn Sie keine der Funktionen einer DLL erneut aufrufen möchten, können Sie den Befehl CLEAR DLLS ausgeben, um die DLL aus dem Arbeitsspeicher zu löschen und Ressourcen freizugeben.

Anmerkung   Wenn Sie CLEAR DLLS ausgeben, werden alle deklarierten DLL-Funktionen aus dem Arbeitsspeicher gelöscht.

Übergeben von Parametern an eine DLL

Wenn Sie eine DLL-Funktion registrieren, müssen Sie die entsprechende Anzahl sowie die Datentypen ihrer Parameter angeben. Die Daten werden standardmäßig als Wert übergeben. Sie können einen Parameter als Verweis übergeben, indem Sie ein @-Zeichen vor seinen Namen setzen.

Meist gelten für DLL-Funktionen die Datentypvereinbarungen, die in C verwendet werden. Diese Vereinbarungen stimmen nicht mit denen von Visual FoxPro überein. Zum Beispiel unterstützen DLL-Funktionen keinen Datentyp, der speziell für Datums- oder Währungswerte vorgesehen ist. Liegen die Daten, die Sie an eine DLL-Funktion übergeben, in einem Datentyp vor, der nicht unterstützt wird, müssen Sie die Daten vor der Übergabe in einen geeigneten Datentyp umwandeln. Zum Beispiel können Sie folgende Befehle verwenden, um ein Datum in ein numerisches Julianisches Format umzuwandeln:

cDate = sys(11, date())
nDate = val( cDate )

Für einige DLL-Funktionen sind komplexere Parameter, z. B. Strukturen oder Arrays, erforderlich. Wenn für die jeweilige Funktion ein Zeiger auf eine Struktur erforderlich ist, gehen Sie wie folgt vor: Klären Sie, wie die Struktur aufgebaut ist, und emulieren Sie die Struktur dann in Visual FoxPro mit einer Zeichenfolge, bevor Sie die Struktur an die DLL-Funktion übergeben oder von dieser entgegennehmen. Zum Beispiel erwartet die Windows-Systemfunktion GetSystemTime( ) einen Zeiger auf eine Struktur, die aus acht Werten des Datentyps word oder unsigned int besteht, die das Jahr, den Monat, den Tag usw. angeben. Die Struktur ist folgendermaßen definiert:

typedef struct _SYSTEMTIME { 
   WORD wYear ;
   WORD wMonth ;
   WORD wDayOfWeek ;
   WORD wDay ;
   WORD wHour ;
   WORD wMinute ;
   WORD wSecond ;
   WORD wMilliseconds ;
} SYSTEMTIME

Um Daten zwischen Visual FoxPro und der GetSystemTime( )-Funktion zu übergeben, erstellen Sie eine als Puffer dienende 40 Byte lange Zeichenfolge (die zunächst aus Leerzeichen besteht) und übergeben die Adresse dieser Zeichenfolge an die Funktion. Die von der Funktion zurückgegebene Zeichenfolge müssen Sie in 2-Byte-Intervallen auswerten, um die einzelnen Felder der Struktur zu extrahieren. Der folgende Programmausschnitt veranschaulicht für drei Felder der Struktur, wie Sie diese extrahieren können.

DECLARE INTEGER GetSystemTime IN win32api STRING @
cBuff=SPACE(40)
=GetSystemTime(@cBuff)

tYear = ALLTRIM(STR(ASC(SUBSTR(cBuff,2)) *  ; 
   256 + ASC(SUBSTR(cBuff,1))))
tMonth = ALLTRIM(STR(ASC(SUBSTR(cBuff,4)) * ; 
   256 + ASC(SUBSTR(cBuff,3))))
tDOW = ALLTRIM(STR(ASC(SUBSTR(cBuff,6)) * ; 
   256 + ASC(SUBSTR(cBuff,5))))

Weitere Informationen finden Sie im Beispielformular Systime.scx im Visual FoxPro-Verzeichnis …\Samples\Solution\Winapi. Weitere Beispiele zum Übergeben von Parametern an DLL-Funktionen finden Sie im Programm Registry.prg, das sich im Visual FoxPro-Verzeichnis …\Samples\Classes befindet.

Wenn die Daten, mit denen Sie in Visual FoxPro arbeiten, in einem Array vorliegen, müssen Sie diesen Array in einer Schleife durchlaufen und die Daten zu einer Zeichenfolge verketten, die einem Array im C-Format entspricht. Erst danach können Sie die Daten an die DLL-Funktion übergeben. Erwartet die Windows-Funktion 16-Bit- oder 32-Bit-Werte, müssen Sie die Werte in ihre Hex-Entsprechungen umwandeln, bevor Sie sie zu einer Zeichenfolge verketten. Wenn Sie die Zeichenfolge übergeben, die die Arraydaten enthält, übergibt Visual FoxPro die Adresse der Zeichenfolgenvariable an die DLL-Funktion, die die Zeichenfolge dann als Array verarbeiten kann. Ein Beispiel hierzu finden Sie im Beispielformular Syscolor.scx, das sich im Visual FoxPro-Verzeichnis …\Samples\Solution\Winapi befindet.

Siehe auch

Zugreifen auf ActiveX-Steuerelemente und -Objekte | Zugreifen auf eine Visual FoxPro-Bibliothek | Erweitern von Visual FoxPro mit externen Bibliotheken | Zugreifen auf die Visual FoxPro-API | DECLARE - DLL-Befehl | CLEAR-Befehle