Dela via


Exportera från en DLL med def-filer

En moduldefinitions- eller DEF-fil (*.def) är en textfil som innehåller en eller flera modulinstruktioner som beskriver olika attribut för en DLL. Om du inte använder nyckelordet __declspec(dllexport) för att exportera DLL-funktionerna kräver DLL-filen en DEF-fil.

En minimal DEF-fil måste innehålla följande module-definition-instruktioner:

  • Den första instruktionen i filen måste vara LIBRARY-instruktionen. Den här instruktionen identifierar DEF-filen som tillhör en DLL. LIBRARY-instruktionen följs av namnet på DLL:en. Länkaren placerar det här namnet i DLL:ns importbibliotek.

  • EXPORT-instruktionen visar namnen och, om du vill, ordningsvärdena för de funktioner som exporteras av DLL:en. Du tilldelar funktionen ett ordningstal genom att följa funktionens namn med ett vidtecken (@) och ett tal. När du anger ordningstal måste de ligga i intervallet 1 till N, där N är antalet funktioner som exporteras av DLL:n. Om du vill exportera funktioner efter ordning läser du Exportera funktioner från en DLL efter ordningstal i stället för efter namn samt det här avsnittet.

En DLL som innehåller koden för att implementera ett binärt sökträd kan till exempel se ut så här:

LIBRARY   BTREE
EXPORTS
   Insert   @1
   Delete   @2
   Member   @3
   Min   @4

Om du använder MFC DLL-guiden för att skapa en MFC DLL skapar guiden en skeleton DEF-fil åt dig och lägger automatiskt till den i projektet. Lägg till namnen på de funktioner som ska exporteras till den här filen. För DLL:er som inte är MFC skapar du DEF-filen själv och lägger till den i projektet. Gå sedan till Project>Properties>Linker>Input>Module Definition File och ange namnet på DEF-filen. Upprepa det här steget för varje konfiguration och plattform, eller gör allt på en gång genom att välja Konfiguration = Alla konfigurationer och Plattform = Alla plattformar.

Om du exporterar funktioner i en C++-fil måste du antingen placera de dekorerade namnen i DEF-filen eller definiera dina exporterade funktioner med C-standardlänkage med hjälp av extern "C". Om du behöver placera de dekorerade namnen i DEF-filen kan du hämta dem med hjälp av DUMPBIN-verktyget eller med hjälp av alternativet linker /MAP . Observera att de dekorerade namnen som skapas av kompilatorn är kompilatorspecifika. Om du placerar de dekorerade namnen som skapats av Microsoft C++-kompilatorn (MSVC) i en DEF-fil måste program som länkar till din DLL också skapas med samma version av MSVC så att de dekorerade namnen i det anropande programmet matchar de exporterade namnen i DLL:s DEF-fil.

Anmärkning

En DLL som skapats med Visual Studio 2015 kan användas av program som skapats med Visual Studio 2017 eller Visual Studio 2019.

Om du skapar ett tilläggs-DLL och exporterar med en DEF-fil placerar du följande kod i början och slutet av huvudfilerna som innehåller de exporterade klasserna:

#undef AFX_DATA
#define AFX_DATA AFX_EXT_DATA
// <body of your header file>
#undef AFX_DATA
#define AFX_DATA

Dessa rader säkerställer att MFC-variabler som används internt eller som läggs till i dina klasser exporteras (eller importeras) från MFC-tilläggets DLL. När du till exempel härleder en klass genom att använda DECLARE_DYNAMIC, expanderas makrot för att lägga till en CRuntimeClass medlemsvariabel i klassen. Om du utelämnar dessa fyra rader kan DLL-filen kompilera eller länka felaktigt eller orsaka ett fel när klientprogrammet länkar till DLL-filen.

Vid skapandet av DLL använder länkaren DEF-filen för att skapa en exportfil (.exp) och en importfil (.lib). Länkaren använder sedan exportfilen för att skapa DLL-filen. Körbara filer som implicit länkar till en DLL använder importbiblioteket när de skapas.

Observera att MFC själv använder DEF-filer för att exportera funktioner och klasser från MFCx0.dll.

Vad vill du göra?

Vad vill du veta mer om?

Se även

Exportera från en DLL