Statische versus dynamische DLL-laden met Delphi

Een DLL (Dynamic Link Library) fungeert als een gedeelde bibliotheek met functies die kunnen worden opgeroepen door tal van applicaties en andere DLL's. Delphi laat je maak en gebruik DLL's zodat u deze functies naar believen kunt aanroepen. U moet deze routines echter importeren voordat u ze kunt aanroepen.

Functies die vanuit een DLL worden geëxporteerd, kunnen op twee manieren worden geïmporteerd: door een externe procedure of functie (statisch) te declareren of door directe aanroepen van DLL-specifieke API-functies (dynamisch).

Laten we een eenvoudige DLL beschouwen. Hieronder staat de code voor "circle.dll" die een functie exporteert, genaamd "CircleArea", die het gebied van een cirkel berekent met de gegeven straal:

Zodra u de circle.dll hebt, kunt u de geëxporteerde "CircleArea" -functie vanuit uw toepassing gebruiken.

Statische belasting

De eenvoudigste manier om een ​​procedure of functie te importeren, is deze te declareren met behulp van de externe richtlijn:

Als u deze verklaring opneemt in het interfacegedeelte van een eenheid, wordt cirkel.dll eenmaal geladen wanneer het programma start. Tijdens de uitvoering van het programma is de functie CircleArea beschikbaar voor alle eenheden die de eenheid gebruiken waar de bovenstaande verklaring zich bevindt.

instagram viewer

Dynamisch laden

U kunt toegang krijgen tot routines in een bibliotheek door directe aanroepen van Win32-API's, waaronder LoadLibrary, FreeLibrary, en GetProcAddress. Deze functies worden gedeclareerd in Windows.pas.

U kunt als volgt de CircleArea-functie aanroepen met dynamisch laden:

Bij het importeren met dynamisch laden, wordt de DLL niet geladen totdat de aanroep van LoadLibrary. De bibliotheek wordt door de bel naar FreeLibrary.

Bij statisch laden wordt de DLL geladen en worden de initialisatiesecties uitgevoerd voordat de initialisatiesecties van de aanroepende toepassing worden uitgevoerd. Dit wordt omgekeerd door dynamisch laden.

Moet u statisch of dynamisch gebruiken?

Hier is een eenvoudige blik op de voor- en nadelen van zowel statische als dynamische DLL-laden:

Statische belasting

Voordelen:

  • Gemakkelijker voor een beginnende ontwikkelaar; geen "lelijk" API-aanroepen.
  • DLL's worden slechts één keer geladen wanneer het programma start.

Nadelen:

  • De applicatie start niet als er DLL's ontbreken of niet gevonden kunnen worden. Een dergelijke foutmelding verschijnt: "Deze applicatie kan niet worden gestart omdat 'missing.dll' niet is gevonden. Herinstalleren van de applicatie kan dit probleem oplossen". Door het ontwerp omvat de DLL-zoekvolgorde met statische koppeling de directory van waaruit de applicatie geladen, de systeemdirectory, de Windows-directory en de directories in de PATH-omgeving variabel. Merk ook op dat de zoekvolgorde voor verschillende Windows-versies kan verschillen. Verwacht altijd dat alle DLL's in de directory staan ​​waar de aanroepende applicatie zich bevindt.
  • Er wordt meer geheugen gebruikt omdat alle DLL's worden geladen, zelfs als u sommige functies niet zult gebruiken

Dynamisch laden

Voordelen:

  • U kunt uw programma zelfs uitvoeren als sommige van de gebruikte bibliotheken niet aanwezig zijn.
  • Kleinere geheugenconsumptie omdat de DLL's alleen worden gebruikt wanneer dat nodig is.
  • U kunt het volledige pad naar de DLL specificeren.
  • Kan worden gebruikt voor modulaire toepassingen. De applicatie toont (laadt) modules (DLL's) die "goedgekeurd" zijn voor de gebruiker.
  • De mogelijkheid om een ​​bibliotheek dynamisch te laden en te lossen, vormt de basis van een plug-insysteem waarmee een ontwikkelaar extra functionaliteit aan programma's kan toevoegen.
  • Neerwaartse compatibiliteit met oudere Windows-versies waarin systeem-DLL's mogelijk niet dezelfde functies ondersteunen of op dezelfde manier worden ondersteund. Door eerst de Windows-versie te detecteren en vervolgens dynamisch te koppelen op basis van waar uw app op draait, kunt u meer ondersteunen versies van Windows en bieden oplossingen voor oudere besturingssystemen (of op zijn minst gracieus functies uitschakelen die u niet kunt ondersteuning.)

Nadelen:

  • Vereist meer code, wat niet altijd gemakkelijk is voor een beginnende ontwikkelaar.
instagram story viewer