Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Du kan exportera funktioner på något av två sätt – en .def-fil eller nyckelordet __declspec(dllexport) . För att hjälpa dig att avgöra vilket sätt som är bättre för din DLL kan du överväga följande frågor:
Planerar du att exportera fler funktioner senare?
Används din DLL endast av program som du kan återskapa, eller används den av program som du inte kan återskapa, till exempel program som skapas av tredje part?
Fördelar och nackdelar med att använda .def-filer
Om du exporterar funktioner i en .def-fil får du kontroll över exportordningarna. När du lägger till en exporterad funktion i din DLL kan du tilldela den ett högre ordningstal än någon annan exporterad funktion. När du gör detta behöver program som använder implicit länkning inte länka om med importbiblioteket som innehåller den nya funktionen. Detta är mycket praktiskt om du utformar en DLL för användning av många program eftersom du kan lägga till nya funktioner och även se till att den fortsätter att fungera korrekt med de program som redan är beroende av den. Till exempel skapas MFC-DLL:er med hjälp av .def-filer.
En annan fördel med att använda en .def-fil är att du kan använda NONAME attributet för att exportera en funktion. Detta placerar endast ordningstalet i exporttabellen i DLL:en. För DLL:er som har ett stort antal exporterade funktioner kan du minska DLL-filens storlek med hjälp NONAME av attributet. Information om hur du skriver en moduldefinitionsinstruktion finns i Regler för Module-Definition-instruktioner. Information om ordningstalsexport finns i Exportera funktioner från en DLL efter ordningstal i stället för efter namn.
En nackdel med att använda en .def-fil är att om du exporterar funktioner i en C++-fil måste du antingen placera de dekorerade namnen i .def-filen eller definiera de exporterade funktionerna med hjälp av externt "C" för att undvika namndekorationen som görs av MSVC-kompilatorn.
Om du placerar 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 . De dekorerade namn som skapas av kompilatorn är kompilatorspecifika. Om du placerar de dekorerade namnen som skapas av kompilatorn i en .def-fil måste de program som länkar till DLL:en också skapas med samma version av kompilatorn så att de dekorerade namnen i det anropande programmet matchar de exporterade namnen i .def-filen i DLL-filen.
Fördelar och nackdelar med att använda __declspec(dllexport)
Det är praktiskt att använda __declspec(dllexport) eftersom du inte behöver bekymra dig om att underhålla en .def-fil och hämta de dekorerade namnen på de exporterade funktionerna. Det här sättet att exportera begränsas dock av antalet länkade program som du är villig att återskapa. Om du återskapar DLL med nya exporter måste du också återskapa programmen eftersom de dekorerade namnen för exporterade C++-funktioner kan ändras om du använder en annan version av kompilatorn för att återskapa den.
Vad vill du göra?
Exportera C-funktioner för användning i körbara C- eller C++-språk
Importera till ett program med hjälp av __declspec(dllimport)