Erstellen einer FLL-Bibliothek
Da eine FLL-Bibliothek im Wesentlichen eine DLL ist, aus der die Visual FoxPro-API aufgerufen wird, erstellen Sie eine FLL-Bibliothek, indem Sie in Ihrer Entwicklungsumgebung die Schritte ausführen, mit denen eine DLL erstellt wird.
So erstellen Sie ein Projekt für die FLL-Bibliothek
- Starten Sie Microsoft Visual C/C++.
- Wählen Sie aus dem Menü Datei den Befehl Neu.
- Klicken Sie im Dialogfeld Neu auf Projekt.
- Geben Sie im Dialogfeld Neues Projekt einen Projektnamen an.
- Wählen Sie in der Liste Typ den Eintrag Win32 Dynamic-Link Library aus.
Nachdem Sie die Grundstruktur der DLL erstellt haben, fügen Sie die Funktionen hinzu, die Sie aus Visual FoxPro aufrufen können möchten. In den folgenden Abschnitten sind sowohl für C als auch C++ die Gerüste beschrieben, entsprechend denen Funktionen erstellt werden können.
Einrichten einer Bibliotheksvorlage
Jede Funktionsbibliothek, die Sie anlegen, hat die gleiche Grundstruktur. Wenn Sie eine Vorlage für die Struktur verwenden, müssen Sie nur noch die Leerstellen ausfüllen, die sich auf Ihre spezifische Bibliotheksroutine beziehen.
Eine Bibliotheksvorlage in Visual FoxPro hat folgende fünf Elemente:
- Die
#include
-Anweisung - Die Definition der Funktion
- Den Code der Funktion
- Die Struktur FoxInfo
- Die Struktur FoxTable
Eine C-Beispielvorlage
Anhand der nachstehenden Vorlage können Sie Bibliotheken in C erstellen:
#include <Pro_ext.h>
void Internal_Name(ParamBlk *parm)
{
// function code goes here.
}
FoxInfo myFoxInfo[] = {
{"FUNC_NAME", (FPFI) Internal_Name, 0, ""},
};
FoxTable _FoxTable = {
(FoxTable *)0, sizeof(myFoxInfo)/sizeof(FoxInfo), myFoxInfo
};
Eine C++-Beispielvorlage
Sie können die nachstehende Vorlage für C++-Routinen verwenden. Diese Vorlage unterscheidet sich von der C-Vorlage insofern, als sie die Struktur FoxTable
als extern deklariert:
#include <Pro_ext.h>
void Internal_Name(ParamBlk *parm)
{
// function code goes here.
}
FoxInfo myFoxInfo[] = {
{"FUNC_NAME", (FPFI) Internal_Name, 0, ""},
};
extern "C" {
FoxTable _FoxTable = {
(FoxTable *)0, sizeof(myFoxInfo)/sizeof(FoxInfo), myFoxInfo
};
}
Verwenden der Vorlage
Um die Headerdatei verwenden und eine kompilierte Bibliothek erstellen zu können, benötigen Sie:
- Die Headerdatei Pro_ext.h. Sie können diese Datei drucken, wenn Sie die in der Visual FoxPro-API verwendeten Funktionsdeklarationen, Typdefinitionen (typedef) und Strukturen (struct) einsehen möchten.
- Die Datei Winapims.lib.
Beide Dateien werden im Unterverzeichnis ...\Samples\API installiert, wenn Sie Visual FoxPro installieren.
Die Funktionsdefinition gibt void
zurück und erwartet den folgenden Parameter: ParamBlk *parm
. Eine Beschreibung der Struktur ParamBlk
finden Sie unter Übergeben und Empfangen von Parametern.
Abgesehen von den beiden oben aufgeführten Dateien sind die Strukturen FoxInfo und FoxTable die beiden einzigen notwendigen Elemente einer Visual FoxPro-Bibliothek.
Verwenden der Strukturen "FoxInfo" und "FoxTable"
Ihre Bibliotheksfunktionen kommunizieren mit Visual FoxPro über die jeweilige FoxInfo-Struktur. Anhand dieser Struktur ermittelt Visual FoxPro den Funktionsnamen sowie Anzahl und Typ der Parameter. Die Struktur FoxTable ist eine verknüpfte Liste, die Informationen über die FoxInfo-Strukturen verwaltet. In der Datei Pro_ext.h, die im Visual FoxPro-Verzeichnis ...\Samples\API abgelegt ist, finden Sie die Definitionen der Strukturen FoxInfo und FoxTable.
Die Struktur "FoxInfo"
Die Struktur FoxInfo ist das Vehikel für die Übermittlung von Funktionsnamen und Parameterbeschreibungen zwischen Visual FoxPro und Ihrer Bibliothek. Eine allgemeine FoxInfo-Struktur sieht wie folgt aus:
FoxInfo arrayname[ ] = {
{funcName1, FPFI function1, parmCount1, parmTypes1}
{funcName2, FPFI function2, parmCount2, parmTypes2}
. . .
{funcNameN, FPFI functionN, parmCountN, parmTypesN}
};
Hierbei sind die Platzhalter wie folgt definiert:
- arrayname
Eine Variable des Typs FoxInfo. Beachten Sie, dass Sie mehrere FoxInfo-Strukturzeilen in diesem Array unterbringen können. - FuncName
Enthält den Namen (in Großbuchstaben und mit höchstens 10 Zeichen), den ein Visual FoxPro-Anwender zum Aufruf Ihrer Funktion verwendet. - function
Die Adresse Ihrer C-Routine. Hierbei handelt es sich um den exakten Namen (unter Berücksichtigung von Groß- und Kleinschreibung), den Sie zur Definition Ihrer Funktion verwenden. - parmCount
Gibt die Anzahl der in der Zeichenfolge parmTypes beschriebenen Parameter oder einen der folgenden Attributwerte an:Wert Beschreibung INTERNAL Gibt an, dass die Funktion nicht direkt aus Visual FoxPro heraus aufgerufen werden kann. CALLONLOAD Gibt an, dass die Funktion aufgerufen werden muss, wenn die Bibliothek geladen wird. CALLONUNLOAD kann keine Funktion aufrufen, die Ergebnisse an Visual FoxPro zurückgibt. CALLONUNLOAD Gibt an, dass die Funktion aufgerufen werden muss, wenn die Bibliothek aus dem Arbeitsspeicher gelöscht oder wenn der Visual FoxPro-Befehl QUIT ausgegeben wird. CALLONUNLOAD kann keine Funktion aufrufen, die Ergebnisse an Visual FoxPro zurückgibt. - parmTypes
Beschreibt den Datentyp jedes Parameters. Die folgende Tabelle enthält eine Liste der gültigen Werte für parmTypes.Wert Beschreibung ""
Kein Parameter "?"
Es kann jeder Typ übergeben werden. Im Hauptteil der Funktion müssen Sie den Typ des übergebenen Parameters ermitteln. "C"
Parameter des Typs Zeichen (Character) "D"
Parameter des Typs Datum (Date) "I"
Parameter des Typs Integer "L"
Parameter des Typs Logisch (Logical) "N"
Parameter des Typs Numerisch (Numeric) "R"
Verweis (Reference) "T"
Parameter des Typs DatumZeit (DateTime) "Y"
Parameter des Typs Währung (Currency) "O"
Parameter des Typs Objekt (Object)
Geben Sie für jeden Parameter, den Sie an die Bibliothek übergeben, einen Typ an. Wenn Sie beispielsweise eine Funktion erstellen, die einen Zeichenparameter und einen numerischen Parameter akzeptiert, ersetzen Sie parmTypes durch "CN".
Anmerkung Wenn ein Parameter optional ist, zeigen Sie es an, indem Sie dem Parameter einen Punkt voranstellen. Nur nachgestellte Parameter können fehlen.
Die folgende Struktur FoxInfo
definiert eine Bibliothek mit einer Funktion (interner Name dates
und externer Name DATES
), die einen Parameter des Typs Zeichen akzeptiert:
FoxInfo myFoxInfo[] = {
{ "DATES", (FPFI) dates, 1, "C" }
};
Wenn Sie die Bibliothek mit dieser FoxInfo-Struktur kompiliert und mit dem SET LIBRARY TO-Befehl in Visual FoxPro geladen haben, können Sie diese Funktion in Visual FoxPro mit der folgenden Programmzeile aufrufen:
=DATES("01/01/95")
Die Struktur "FoxTable"
Die Struktur FoxTable ist eine verknüpfte Liste, die alle FoxInfo-Strukturen verfolgt, die für eine bestimmte Bibliothek vorhanden sind:
FoxTable _FoxTable = {nextLibrary, infoCount,infoPtr};
Hierbei sind die Platzhalter wie folgt definiert:
- nextLibrary
Ein von Visual FoxPro intern verwendeter Zeiger, der mit 0 initialisiert werden sollte. - infoCount
Die Anzahl der externen Visual FoxPro-Funktionen, die in dieser Bibliothek definiert sind. - infoPtr
Die Adresse des ersten Elements eines Arrays aus FoxInfo-Strukturen. Dieser Name muss mit dem Array-Namen übereinstimmen, der in der FoxInfo-Anweisung angegeben ist.
Nachfolgend ein Beispiel für eine FoxTable-Anweisung. Wenn Ihr FoxInfo-Array-Name gleich myFoxInfo
ist, brauchen Sie diese Anweisung nie zu ändern:
FoxTable _FoxTable = {
(FoxTable *) 0,
sizeof( myFoxInfo) / sizeof( FoxInfo ),
myFoxInfo
};
Visual FoxPro erfasst allgemeine Schutzverletzungen (General Protection Faults, GPFs) in ActiveX-Steuerelementen, die auf einem Formular platziert werden, oder in COM-Objekten, die innerhalb von Visual FoxPro instanziiert werden. Ein GPF in einem ActiveX-Steuerelement oder COM-Objekt wird nun als auffangbarer Visual FoxPro-Fehler behandelt (Fehler 1440 – OLE-Objekt kann beschädigt sein).
Siehe auch
Erstellen eines ActiveX-Objekts | Erstellung der API-Bibliothek | Hinzufügen von Visual FoxPro-API-Aufrufen | Zugreifen auf die Visual FoxPro-API | Erweitern von Visual FoxPro mit externen Bibliotheken | Übergeben und Empfangen von Parametern | SET LIBRARY TO