Home Grootte veranderen MSGBOX Kolommen & TABS DLL bestanden Printen Geluid afspelen PB en de Euro Menu's

Omhoog

Email me

Gebruik van DLL bestanden

Hierover is veel onduidelijkheid als ik de vragen die aan mij worden gesteld als voorbeeld neem. Toch is het even weten hoe het moet. Stel: u heeft een gecompileerd DLL bestand (bijvoorbeeld van iemand gekregen of gekocht) met een aantal leuke routines er in. Nu zijn er een paar gevallen mogelijk:

U weet buiten de DLL die u heeft verder niets van de DLL en de routines. Nou dat is dan jammer, want u moet namelijk exact weten HOE de routines heten in de DLL en HOE u ze moet aanroepen, met welke parameters en waardes. De DLL is dus zo niet bruikbaar.
U heeft naast de DLL een beschrijving van de functies die extern (buiten de DLL) beschikbaar zijn: naast de exacte naam worden ook de parameters beschreven. Hiermee kunt u aan de gang, want zo te zien heeft u alles wat u nodig heeft.
U heeft naast het DLL bestand ook nog een bestand met dezelfde naam vr de punt en met de extensie .INC ! Hoera, want dat houdt meestal in dat het een zogenaamd include bestand is, met meestal alle declaraties in het bestand aanweizg. Wel erop letten dat het include bestand voor PowerBASIC is bedoeld, want anders moet u nog wat zaken misschien aan passen.

U ziet hier een voorbeeld voor het met PB/DLL meegeleverde voorbeeld Capfirst.bas (staat in de Samples directorie onder VB32). Dit bestand zelf bevat de volgende programma code:

$COMPILE DLL
FUNCTION CapFirst(vbString AS STRING) EXPORT AS STRING
    LOCAL Temp AS STRING
    LOCAL Letter AS BYTE PTR
    LOCAL PrvChr AS BYTE

    Temp = vbString
    PrvChr = 32
    Letter = STRPTR(Temp)
    DO WHILE @Letter > 0
        IF PrvChr = 32 THEN
            IF (@Letter > 96) AND (@Letter < 123) THEN
                @Letter = @Letter - 32
            END IF
        END IF
        PrvChr = @Letter
        INCR Letter
    LOOP
    FUNCTION = Temp
END FUNCTION

Het bestand wordt door de compiler directive $compile DLL tot een DLL omgezet. PB/CC heeft deze mogelijkheid zelf niet om DLL bestanden te maken, dus daarom is de gecompileerde uitvoering hier te vinden. We zullen deze DLL gebruiken als voorbeeld bestand om te leren DLLs aan te roepen.

De DLL bevat dus maar n functie en wel met de naam CAPFIRST. Doel van deze functie is om elke eerste letter van een woord te veranderen in een hoofdletter. Cruciaal is trouwens het woord EXPORT, aangezien zonder dit woord de functie alleen binnen de DLL is te gebruiken. Dus zonder het woord kunt u het wel door andere routines in dezelfde DLL gebruiken, maar niet door andere gebruikers buiten de DLL. Denk bijvoorbeeld aan een wachtwoord routine: u moet die binnen de DLL gebruiken, maar wilt niet dat andere gebruikers de routine aanroepen om het wachtwoord proberen te achterhalen.

De functie die als enige in de export lijst staat, zult u binnen uw eigen programma moeten bekend stellen. Daarvoor moet u vier dingen aangeven:

  1. om welke routine het gaat, dus de naam
  2. uit welke DLL de routine moet komen
  3. welke lijst van parameters bij de aanroep moet worden gebruikt
  4. wat het type van de routine is als het een functie betreft

U ziet het: veel zaken moet u ook al doen als uw code bovenin uw programma een functie of subroutine gebruitk die pas later in de code voorkomt. U gebruikt dan het DECLARE statement om de compiler de noodzakelijke gegevens te verschaffen.

Het declare statement voor het gebruik van een DLL is vergelijkbaar:

DECLARE FUNCTION CapFirst LIB "CAPFIRST.DLL" (vbString AS STRING) AS STRING

U geeft dus eerst de naam van de functie op, gevolgd door de plaats waar de functie is te vinden, en wel de betreffende DLL, waarbij u ook de extensie moet opgeven (.DLL dus). Zorg er bovendien voor dat ook bij uitvoering het DLL bestand is te vinden, want u gebruikt immers een apart bestand!
Vervolgens geeft u de parameter lijst op, in dit geval maar n. Tenslotte het type van de functie, hier een string.
In uw bestand heeft u nu aangegeven hoe de functie moet worden aangeroepen. Fouten die u hiermee maakt kunnen tot uiteenlopende foutsituaties leiden, die niet altijd even duidelijk zijn.

Na het definiren van de functie gaan we er gebruik van maken ook. Ons programma ziet er als volgt uit:


DECLARE FUNCTION CapFirst LIB "CAPFIRST.DLL" (vbString AS STRING) AS STRING
FUNCTION PBMAIN() AS LONG
LOCAL tekst AS STRING
CLS
        tekst=CapFirst("dit is een zin.")
        PRINT tekst
        WHILE NOT INSTAT
            WEND
END FUNCTION

We roepen de functie dus aan, net alsof de routine gewoon in de source aanwezig is. Ook dit programmaatje is in gecompileerde vorm aanwezig en wel hier te vinden. Het is gecompileerd met PB/CC 2.0, dus opent een Windows console om de resultaten te laten zien. U ziet dan dat steeds de eerste letter van elk woord een hoofdletter is geworden. Zorg er wel voor dat de .EXE de .DLL steeds kan vinden. Vroeger zette men dan de .DLL bestanden in de Windows directorie, zodat dezelfde programma's dezelfde DLL bestanden konden gebruiken. Tegenwoordig is het beleid: zet alle DLL bij je eigen toepassing, zodat er geen versie conflicten kunnen optreden. Dus bijvoorbeeld beide bestanden in dezelfde directorie plaatsen.

Tenslotte nog een verwijzing naar een ZIP bestand, waarin de twee BAS files zitten, het EXE bestand en de DLL.

Bezoek het PB forum in het Nederlands en/of teken mijn gastenboek.

Datum laatste aanpassing:
29 december 2003 03:42:26

Email mij voor reacties,
aanvullingen en correcties