REM Datei: VBTEST.DLL REM Typ: dynamische Link-Bibliothek für Visual Basic für Windows REM Sprache: GFA Basic für Windows (Compiler) REM Aufgabe: Einführung in die Grundlagen der DLL-Programmierung REM für Visual Basic für Windows mit GFA Basic für Windows REM Autor: Dipl.-Ing. Andreas Maslo REM (c)1993: IngES $library VBTEST $LNK EXE VBTEST.DLL PROCEDURE LibMain(inst&, dat&, hpsz, cmd%) //diese Prozedur wird automatisch beim Laden der DLL aufgerufen IF VB:VERSION = 0 ALERT 3,"Die DLL VBTEST.DLL ist nur von Visual Basic für Windows nutzbar!",1,"OK",x& RETVAL 0 ELSE RETVAL 1 ENDIF RETURN PROCEDURE IntegerTest() //Prozedur exportieren //Routinen innerhalb von DLLs werden über den exportierten //Namen und nicht über den Namen innerhalb des Prozedur- //kopfes aufgerufen; beide Namen können sich voneinander //unterscheiden $EXPORT IntegerTest //Ganzzahlwert an aufrufendes Programm zurückgeben RETVAL 5 //Hinweis: diese Prozedur muß als Funktion deklariert werden RETURN PROCEDURE ReferenceTest(VAR Ergebnis) //VAR = Call By Reference, um Werte über Parameterlisten //an das aufrufende Hauptprogramm zurückzugeben $EXPORT ReferenceTest Ergebnis=1.23456 RETVAL 0 RETURN //Beachten Sie, daß eine Stringübergabe an Visual Basic in //der nachfolgenden Form NICHT möglich ist, da Strings //anders als unter GFA-Basic verwaltet werden //PROCEDURE StringTest(VAR Test$) // $EXPORT StringTest // Test$="Test" // RETVAL 0 //RETURN PROCEDURE StringTest(Text%) //Text als Zeiger von VB übernehmen, in einen String //umwandeln und ausgeben $EXPORT StringTest 'Zeichenkette über Pointer einlesen und anzeigen; 'CHAR wandelt Pointer in Zeichenkette um MESSAGE CHAR{Text%}, "VBTEST.DLL",MB_OK, x& //Zeichenkette in Großbuchstaben konvertieren und //an aufrufendes Programm zurückübergeben Temp$ = CHAR{Text%} Temp$= UCASE$(Temp$) //Hinweis: Beachten Sie, daß die Länge der durch // den Pointer übergebenen Zeichenkette nicht // mit POKE$ erweitert werden kann! // Unter Umständen muß die Zeichenkette mit // Space$() oder String$() bereits in VB auf die // maximal benötigte Zeichenkettenlänge ge- //bracht werden POKE$ Text%, Temp$ RETURN PROCEDURE ColorDialog() //Beispielprozedur: //Auswahldialog Farben mit Farbdefinition $Export ColorDialog Col%=RGB(0,0,0) IF DIM?(a%())=0 THEN //beim ersten Aufruf noch nicht dimensioniert DIM a%(15) //wird beim 2. Aufruf eine neue Dimensionierung //vorgenommen, kommt es zum Programmabbruch //durch einen Laufzeitfehler ENDIF DLG COLOR 1,0,a%(),Col% //Farbwert zurückgeben RETVAL Col% RETURN PROCEDURE WinDirectory(WinDir%) //Beispiel zum Aufruf einer Windows-API-Routine //(entspricht dem Aufbau innerhalb von VB) //Windows-Pfad ermitteln $Export WinDirectory //Puffer für Ergebnis bereitstellen Buffer$=SPACE$(255) //API-Routine aufrufen P%=GetWindowsDirectory(V:Buffer$, LEN(Buffer$)) POKE$ WinDir%, CHAR{V:Buffer$} 'Pfadlänge als Funktionswert zurückgeben RETVAL P% RETURN PROCEDURE Choose(M%) //Popup-Menü ausgeben, ohne die Menüeinträge //über das VB-Menüentwurfsfenster definieren zu müssen $Export Choose //Fenstertitel, Menüeinträge in der Form: //A$="Titel|Eintrag 1|Eintrag2|...|&Ende" //wird hier als Pointer übergeben Aufbau$ = CHAR{M%} //ein Fenster muß unter GFA-Basic gewöffnet werden, //damit das Popup-Menü erscheint //Rechteck unterhalb des Popup-Menüs zeichnen, damit //das Fenster selbst nicht sichtbar wird OPENW #1, 110,110,20,20, 0 Wahl&=POPUP(Aufbau$, 110,110 , 0) //und wieder schließen CLOSEW #1 RETVAL Wahl& RETURN