440 likes | 651 Views
Arbeiten mit Libraries. Arbeiten mit FLL- und DLL-Libraries unter Microsoft Visual FoxPro. Diese Schulung dient der Einführung in das Arbeiten mit FLLs, DLLS (Windows-API-Funktionen) sowie der Einführung in das Erstellen von FLLs mit der API-Bibliothek von Microsoft Visual FoxPro.
E N D
Arbeiten mit Libraries Arbeiten mit FLL- und DLL-Libraries unterMicrosoft Visual FoxPro
Diese Schulung dient der Einführung in das Arbeiten mit FLLs, DLLS (Windows-API-Funktionen) sowie der Einführung in das Erstellen von FLLs mit der API-Bibliothek von Microsoft Visual FoxPro
Themenübersicht • Arbeiten mit FLLs • Library-Funktionen, FoxTools-Funktionsübersicht, Probleme • Arbeiten mit DLLs • Deklaration, Parameterübergabe, FILER.DLL/Registrierung • Übersicht über WinAPI-Funktionen • Fenster, System, I/O, INI/Registry, Netzwerk/User, Sonstige • Aufruf WINAPI-Funktionen • Variablenzuordnung, Übernahme, Wertebereiche • Erstellen von FLLs • Dateien, Werteübergabe, Werterückgabe, FOXINFO, FOXTABLE, API-Bibliothek, Vor/Nachteile • FoxPro-API-Bibliothek • API-Bibliothek, Typen, Strukturen, Variablen, Speicherzugriff
Arbeiten mit FLLs Einsetzen von FLLs mit Microsoft Visual FoxPro
Library-Funktionen • SET LIBRARY TO <name> ADDITIVE • SET LIBRARY TO, RELEASE LIBR • 16 / 32 bit-Unterscheidung für FLLs • 16bit-FLL nur in FoxPro/Windows (.PLB in DOS) • 32bit-FLL nur in Visual FoxPro
Allgemein: MsgBox RegFn/RegFn32 CallFn FoxToolVer GetProStrg PutProStrg Strings: Reduce StrFilter Words WordsNum NextWord FoxTools-Funktionen (1)
ClipBoard: GetClipDat/Fmt IsClipFmt EnumClipFm RegClipFmt EmptyClip CountClipF Open/CloseClip Editor: siehe API-Bibliothek Fenster: siehe API-Bibliothek Disk/Datei: Übernommen in neue VFP-Version FoxTools-Funktionen (2)
Mögliche Probleme • Link-Bibliotheken versionsabhängig • von der jeweiligen FPW/VFP-Version! • Ergebnis: Fehler 1711 - Revision mismatch • Ggf. nur eine Instanz (!) • z.B. FOXTOOLS.FLL • gemeinsamer Speicher (unter Windows 95) • Ordinalzahl statt Namensexport • #DEFINE FnA 1 • m.LnFnHandle1 = REGFN((FnA),"C@C","I", "MYTEST.DLL")
Arbeiten mit DLLs Einsatz von Standard-DLLs unter Microsoft Visual FoxPro
DECLARE DLL • DECLARE DLL • Beispiel: Declare Integer GetActiveWindow ; IN Win32API AS GetWinHandl • CLEAR DLLS • (siehe Load/FreeLibrary) • 16 / 32 bit-Unterscheidung FLL/DLL • 16bit-DLL RegFn/CallFn über FoxTools in FoxPro/Windows und Visual FoxPro • 32bit-DLL mit DECLARE nur in Visual FoxPro
Parameterübergabe (1) • Datum immer als Integer (hin/rück) • nDate = val( sys( 11, Date() )) • Logische Werte als BOOL (zurück) • BOOL-Rückgabe: 0=FALSE, #0 = TRUE • VOID / BOOL als Integer (zurück) • 16 / 32 bit-Werte hexadezimal • Arrays als String mit C-Array (Ref.) • Übergabe Strukturen kompliziert
Parameterübergabe (2) • LPSTR = Pointer auf Struktur • „C“ in Namen = Constant (als String deklarieren) • andernfalls mit @ deklarieren und aufrufen (!) • Pointer als Parameter möglich • Pointer in Struktur/auf Funktionen nicht abbildbar • Struktur links = Pointer auf Struktur, geliefert wird String - abgeschnitten bei erster Null (!) • Struktur rechts = Bufferübergabe mit String
Strukturdefinition: typedef struct _SYSTEMTIME { WORD wYear ;WORD wMonth ;WORD wDayOfWeek ; WORD wDay ;WORD wHour ;WORD wMinute ;WORD wSecond ;WORD wMilliseconds ;} SYSTEMTIME Umsetzung in VFP: 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)))) Parameterübergabe (3)
FILER.DLL Nachgeliefert als Ersatz für Dateimanager Aufrufbeispiel OLE-Server-DLLs: Registrierung OLE-DLLs mit REGSRV32.EXE ggf. auf .DLL als Aufruf legen... FILER.DLL, Registrierung
WINAPI-Funktionsübersicht Übersicht über Funktionen inWindows-System-DLLs fürMicrosoft Visual FoxPro
WINAPI - Fensterfunktionen • BringWindowToTop • HWND hWnd // handle of window • FindWindow • LPCTSTR lpClassName // address of class name • LPCTSTR lpWindowName // address of window name • GetDesktopWindow • GetParent • ShowWindow
LoadLibrary FreeLibrary GetVersionEx GetLastError SetLastError GetSystemDefault LangID GetCurrencyFormat GetNumberFormat GetDateFormat GetTimeFormat GetTimeZone Information SetLocalTime SetSystemTime WINAPI - Systemfunktionen
GetDriveType siehe Aufstellung GetLogicalDrives siehe Beispiel GetTempFileName GetTempPath GetSystemDirectory GetWindowsDirectory siehe Beispiel 0: Typ konnte nicht festgestellt werden (seltenst der Fall) 1: Das Laufwerk existiert nicht 2: Wechselbar (Disketten, MO, etc. ) 3: "Normale" Festplatte 4: Netzlaufwerk 5: CD-ROM 6: RAM-Disk WINAPI - I/O-Funktionen
INI-Dateien: WritePrivate ProfileSection() WritePrivate ProfileString() GetPrivate ProfileSection() GetPrivate ProfileString() GetPrivateProfileInt() Registry: RegCloseKey() RegCreateKey() RegDeleteKey() RegDeleteValue() RegLoadKey() RegNotifyChangeKeyValue() RegOpenKey() RegQueryInfoKey() RegQueryMultipleValues() RegQueryValue() RegQueryValueEx() RegReplaceKey() RegRestoreKey() RegSaveKey() RegSetValue() INI / Registry - Funktionen
Netzwerk / User - Funktionen • GetUserDefaultLangID • für aktuellen User statt für System • WNetGetUser • NULL-Übergabe für System liefert den User des aktiven Systems • RasDial • umfangreiche Funktionsliste für RAS-Anbindung
WINAPI - Sonstiges • Sleep (Hintergrundprozess) • Beep (Sound-Ausgabe) DECLARE INTEGER Beep IN WIN32API INTEGER, INTEGER *!* DWORD dwFreq, // sound frequency, in hertz *!* DWORD dwDuration // sound duration, in milliseconds ? Beep( 440, 1000 ) • Die Mehrzahl der rund 2000 Funktionen erfordert umfangreiche Strukturen!
WINAPI-Aufrufe Verwendung von Windows-System-DLLs unterMicrosoft Visual FoxPro
Zuordnung zu Variablenarten • #define LPCTSTR STRING (Konstante) • #define LPTSTR STRING@ • #define DWORD INTEGER (Long) • #define LPDWORD INTEGER@ • #define UINT INTEGER (Unsigned Int) • #define LPUINT INTEGER@ (Unsigned Int) • #define LONG INTEGER (32 Bit) • #define BOOL INTEGER • #define VOID INTEGER • #define LPVOID STRING@ (beliebiger Pointer) • #define HANDLE INTEGER (Handle) • #define HWND INTEGER (Handle) • #define HINSTANCE INTEGER (Handle)
Beschreibungen in WINAPI-Hilfe • Vorlage in WINAPI-Hilfe: DWORD WNetGetUser( LPTSTR lpszLocalName, // address of local name to get user name for LPTSTR lpszUserName, // address of buffer for user name LPDWORD lpcchBuffer // address of buffer size variable ); • Visual FoxPro (mit Defines!): DECLARE DWORD WNetGetUser IN WIN32API ; LPTSTR lpszLocalName,; && address of local name to get user name for LPTSTR lpszUserName,; && address of buffer LPDWORD lpcchBuffer && address buffer size variable
Wertebereiche für Variablen • int *2 signed System abhängig (2 Bytes) • unsigned int *2 unsigned System abhängig (2 Bytes) • char 1 signed char -128 bis 127 • unsigned char 1 none 0 bis 255 • short 2 short int -32,768 bis 32,767 • unsigned short 2 ushort int 0 bis 65,535 • long 4 long int -2,147,483,648 bis 2,147,483,647 • unsigned long 4 ulong int 0 bis 4,294,967,295 • enum 2 none -32,768 bis 32,767 • float 4 none 3.4E ± 38 (7 Stellen) • double 8 none 1.7E ± 308 (15 Stellen) • long double 10 none 1.2E ± 4932 (19 Stellen) In VFP sind int/short, unsignd int/unsignd short im Prinzip identisch
Erstellen von FLLs Erstellung von FLLs mit dem Library Construction Kit vonMicrosoft Visual FoxPro
Benötigte Dateien (außer C++) • WINAPIMS.LIB • 1.) alle VFP-Funktionen, die per FLL angesprochen werden können • 2.) etlichen Hilfsfunktionen z.B. für Speichermangagement • Diese Bibliothek wird zu der FLL einfach dazugelinkt • PRO_EXT.H • Deklarationen o.g. Funktionen, wichtige Strukturen, ein paar Konstanten • Einbindung mit: #include <pro_ext.h>
Parameterübergabe • Übergabe Adresse Parameterblock • Enthält Anzahl der Parameter und je Parameter ein Strukturelement mit dem jeweiligen Wert, Ausnahmen: • Referenz-Parameter kommt als Pointer • Stringübergabe als Handle (Adr of Adr) • Hinweis: Datumsübergabe Double (!)
Deklaration als „void“ oder „void far“ - also keine direkten Funktionsresultate Stattdessen Werterückgabe via Funktionsaufruf: _RetChar() _RetCurrency() _RetDateStr() _RetDateTimeStr() _RetFloat() _RetInt() _RetLogical() _RetVal() void EineFunktion(ParamBlk *parm) { _RetChar( "Rückgabe an FoxPro" ); } Werterückgabe
Parameterarten: „“ - kein Parameter „C“ - Charakter „D“ - Datum „I“ - Integer „L“ - Logisch „N“ - Numerisch „R“ - Referenz „T“ - DateTime „Y“ - Währung „O“ - Objekt Feste Funktionen: INTERNAL interne Funktion CALLONLOAD Aufruf beim Laden CALLONUN-LOAD Aufruf beim Entladen (kein Par.) Parameterarten, Funktionen
FOXINFO-Struktur • Name der Funktion unter VFP (Groß) • Name der Funktion in C (Exakt) • Pointer, Type-Cast aus PRO_EXT.H: FPFI • Maximalzahl der Parameter • Typ der Parameter (CSV-Liste, . = opt.) • Beispiel: FoxInfo myFoxInfo[] = { {"VFPFUNKTION",(FPFI) EineFunktion, 2, "I,.C"}, };
FOXTABLE-Struktur • Die eigentliche Verbindung zu FoxPro wird über die Struktur FoxTable hergestellt. FoxPro sucht beim Laden einer FLL diese Struktur und entnimmt ihr alle erforderlichen Informationen. FoxTable _FoxTable = { (FoxTable *) 0, sizeof(myFoxInfo)/sizeof(FoxInfo), myFoxInfo }; Die Sizeof-Berechnungen dienen nur der (dadurch auch bei Strukturänderungen immer korrekten) Berechnung der Anzahl der Einträge innerhalb der FoxInfo-Struktur, m.a.W. der Anzahl der exportierten Funktionen
Template für C / C++ • #include <pro_ext.h>void Internal_Name(ParamBlk *parm){// function code goes here.}FoxInfo myFoxInfo[] = {{"FUNC_NAME", (FPFI) Internal_Name, 0, ""},};extern "C“ { <== für C++FoxTable _FoxTable = {(FoxTable *)0, sizeof(myFoxInfo)/sizeof(FoxInfo), myFoxInfo};} <== für C++
Vorteile: Alle Funktionen von VFP in C verfügbar (seek, wait wind usw.) Keine Deklaration notwendig (Direkt-aufruf möglich) Nachteile: Können nur von FoxPro verwendet werden FLL ohne Rückgabe kann mit Rückgabe deklariert werden (Endung als DLL) Vor-/Nachteile von FLLs
FoxPro-API-Bibliothek Die API-Bibliothek von Microsoft Visual FoxPro
_Activate _Alloc (Speicher) _DB (*) (Datenbank) _Deactivate _Dialog (Message) _Dispose (Löschen) _Ed (*) (Editor) _Error/_ErrorInfo _Evaluate (!) _Execute (!) _F (*) (LowLevel) _Find (Objektsuche) _Free (Freigabe) _Get (Information) API-Bibliothek (1)
_GetItem (Handle) _Global (Variablen) _H (DB-Header) _Mem (Speicher) _Menu (Menü) _Memo (Memo) _Mouse (Maus) _New (Neuanlage) _Object _Put (Ausgabe) _Ret (Rückgabe) _Set (Einstellung) _Str (Konversion) _W (*) (Fenster) API-Bibliothek (2)
API-Datentypen • EDLINE - Zeilennummer Editfenster • EDPOS - Zeichenposition dito • FCHAN - Low-Level-File-Handle • FPFI - Funktionspointer (Integer) • ITEMID - Identifier Menüeintrag • MENUID - Identifier Menü • MHANDLE - Identifier Speicherblock • NTI - Name-Table-Index • WHANDLE - Fenster-Handle
API-Datenstrukturen • EventRec - Ereignisstruktur • FoxInfo - siehe oben • FoxTable - siehe oben • Locator - Übergabe Parameter • ParamBlk - siehe oben • Parameter - Übergabe Parameter Ref. • Point - Koordinaten • Rect - Koordinaten Rechteck • Value - Übergabe Parameter Wert
API-Variablen-Zugriff • NTI = Name Table Index (Array) • _NameTableIndex( ) für Suche • _Load( ) = Lesen • _Store( ) = Schreiben • _NewVar( )= neue Variable • _Release( ) = Variable löschen
API-Speicher-Zugriff • Speicherzugriff über Handles • Handle ist ein Index in ein Array von Pointer auf Speicher • Zugriffsfunktionen unter C: • _AllocHandle( ) • _HLock( ) • _HandToPtr( ) • *-- Verwendung • _HUnLock( ) • Hinweis: _AllocMemo( ) für Memofelder (!)
Fragestellungen • Auswahl und Einsatz von FLLs • Auswahl und Einsatz von DLLs • Einsatz von WIN-API-Funktionen • Selbsterstellung von FLLs mit API
Vielen Dank! Das waren die Themen: • Arbeiten mit FLLs • Library, FoxTools-Übersicht, Probleme • Arbeiten mit DLLs • Deklaration, Parameter-übergabe, FILER/OLE • WinAPI-Funktionen • Fenster, System, I/O, INI/Registry, Netzwerk/User, Sonstige • Variablenzuordnung, Übernahme, Wertebereiche • Erstellen von FLLs • Dateien, Werteübergabe, Werterückgabe, FOXINFO, FOXTABLE, API-Bibliothek, Vor/Nachteile • FoxPro-API-Bibliothek • API-Bibliothek, Typen, Strukturen, Variablen, Speicherzugriff
Wenn Fragen bestehen: Wizards & Builders Methodische Software-Entwicklung GmbH Frankfurter Str. 21b 61476 Kronberg Tel.: 06173-950906 Fax: 06173-950907 CIS: 101605,175