Statisk vs dynamisk DLL-laddning med Delphi

Ett DLL (Dynamic Link Library) fungerar som ett delat bibliotek med funktioner som kan begäras av många applikationer och andra DLL-filer. Delphi låter dig skapa och använda DLL-filer så att du kan ringa dessa funktioner när du vill. Du måste dock importera dessa rutiner innan du kan ringa dem.

Funktioner som exporteras från en DLL kan importeras på två sätt - antingen genom att deklarera en extern procedur eller funktion (statisk) eller genom direktanrop till DLL-specifika API-funktioner (dynamiska).

Låt oss överväga en enkel DLL. Nedan är koden för "cirkel.dll" som exporterar en funktion, kallad "CircleArea", som beräknar en cirkelyta med den angivna radien:

När du har cirkel.dll kan du använda den exporterade "CircleArea" -funktionen från din applikation.

Statisk lastning

Det enklaste sättet att importera en procedur eller funktion är att förklara det med det externa direktivet:

Om du inkluderar denna deklaration i gränssnittsdelen av en enhet laddas cirkel.dll en gång när programmet startar. Under hela körningen av programmet är funktionen CircleArea tillgänglig för alla enheter som använder enheten där ovanstående deklaration är.

instagram viewer

Dynamisk lastning

Du kan komma åt rutiner i ett bibliotek genom direktsamtal till Win32 API, inklusive Loadlibrary, FreeLibrary, och GetProcAddress. Dessa funktioner deklareras i Windows.pas.

Så här ringer du CircleArea-funktionen med dynamisk lastning:

När du importerar med dynamisk lastning laddas inte DLL förrän samtalet till LoadLibrary. Biblioteket lossas av ring till FreeLibrary.

Med statisk laddning laddas DLL och dess initialiseringsavsnitt körs innan anropsapplikationens initialiseringsavsnitt körs. Detta vänds med dynamisk belastning.

Ska du använda statisk eller dynamisk?

Här är en enkel titt på fördelar och nackdelar med både statisk och dynamisk DLL-laddning:

Statisk lastning

Fördelar:

  • Lättare för nybörjare; ingen "ful" API-samtal.
  • DLL-filer laddas bara en gång när programmet startar.

Nackdelar:

  • Programmet startar inte om det saknas några DLL-filer eller inte kan hittas. Ett felmeddelande som detta kommer att visas: "Den här applikationen har inte startat eftersom 'missing.dll' inte hittades. Att installera om programmet kan lösa problemet ". Genom design innehåller DLL-sökordningen med statisk länk katalogen från vilken applikationen laddade, systemkatalogen, Windows-katalogen och kataloger listade i PATH-miljön variabel. Observera också att sökordningen kan skilja sig åt för olika Windows-versioner. Förvänta dig alltid att ha alla DLL-filer i katalogen där den anropande applikationen är.
  • Mer minne används eftersom alla DLL-filer laddas även om du inte använder några av .funktionerna

Dynamisk lastning

Fördelar:

  • Du kan köra ditt program även när några av de bibliotek som den använder inte finns.
  • Mindre minneskonsumtion eftersom DLL-filer endast används vid behov.
  • Du kan ange hela sökvägen till DLL.
  • Kan användas för modulära applikationer. Applikationen visar bara (laddar) moduler (DLL) som "är godkända" för användaren.
  • Möjligheten att ladda och lossa bibliotek dynamiskt är grunden till ett plugin-system som gör det möjligt för en utvecklare att lägga till extra funktionalitet i program.
  • Bakåtkompatibilitet med äldre Windows-versioner där system-DLL-filer kanske inte stöder samma funktioner eller stöds på samma sätt. Om du först upptäcker Windows-versionen och sedan dynamiskt länkar baserat på vad din app kör på, kan du stödja mer versioner av Windows och ger lösningar för äldre operativsystem (eller åtminstone graciöst inaktivera funktioner du inte kan Stöd.)

Nackdelar:

  • Kräver mer kod, vilket inte alltid är lätt för en nybörjare.
instagram story viewer