Megosztás a következőn keresztül:


Exportálás DLL-ből DEF-fájlok használatával

A moduldefiníciós vagy DEF-fájl (*.def) egy vagy több modul-utasítást tartalmazó szövegfájl, amely egy DLL különböző attribútumait írja le. Ha nem a kulcsszót használja a __declspec(dllexport) DLL függvényeinek exportálásához, a DLL-hez DEF-fájl szükséges.

A minimális DEF-fájlnak tartalmaznia kell a következő moduldefiníciós utasításokat:

  • A fájl első utasításának a LIBRARY utasításnak kell lennie. Ez az utasítás a DEF-fájlt DLL-hez tartozóként azonosítja. Az LIBRARY utasítást a DLL neve követi. A linker ezt a nevet a DLL importálási kódtárában helyezi el.

  • Az EXPORT utasítás felsorolja a DLL által exportált függvények nevét és – opcionálisan – a sorszámértékeket. A függvényt sorszámértékként rendelheti hozzá, ha a függvény nevét egy at (@) jellel és egy számmal követi. Az ordinális értékek megadásakor az értékeknek az 1–N tartományban kell lenniük, ahol az N a DLL által exportált függvények száma. Ha a függvényeket sorszám szerint szeretné exportálni, olvassa el a függvények dll-ből történő exportálását név és név helyett sorszám szerint , valamint ezt a témakört.

Egy bináris keresési fa implementálásához szükséges kódot tartalmazó DLL például a következőhöz hasonlóan nézhet ki:

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

Ha az MFC DLL varázslóval hoz létre egy MFC DLL-t, a varázsló létrehoz egy sablon DEF fájlt, és automatikusan hozzáadja a projekthez. Adja hozzá a fájlba exportálandó függvények nevét. Nem MFC DLL-ekhez saját maga hozza létre a DEF fájlt, és adja hozzá a projekthez. Ezután lépjen a Project>Properties>Linker>bemeneti>moduldefiníciós fájljára , és adja meg a DEF fájl nevét. Ismételje meg ezt a lépést minden konfigurációhoz és platformhoz, vagy végezze el egyszerre a Konfiguráció = Minden konfiguráció és a Platform = Minden platform lehetőséget választva.

Ha egy C++ fájlban exportál függvényeket, akkor vagy a DEF fájlba kell helyeznie a dekorált neveket, vagy az exportált függvényeket szabványos C nyelvi kapcsolat szerint kell definiálnia az extern "C" használatával. Ha a dekorált neveket a DEF fájlba kell helyeznie, a DUMPBIN eszközzel vagy a linker /MAP beállítással szerezheti be őket. Vegye figyelembe, hogy a fordító által létrehozott kitüntetett nevek fordítóspecifikusak. Ha a Microsoft C++ fordító (MSVC) által létrehozott dekorált neveket egy DEF-fájlba helyezi, a DLL-hez csatolt alkalmazásokat is az MSVC ugyanazon verziójával kell létrehozni, hogy a hívóalkalmazásban a dekorált nevek megfeleljenek a DLL DEF-fájljában exportált neveknek.

Megjegyzés:

A Visual Studio 2015-tel készült DLL-eket a Visual Studio 2017 vagy a Visual Studio 2019 használatával készült alkalmazások használhatják fel.

Ha bővítmény DLL-t hoz létre, és DEF-fájllal exportál, helyezze a következő kódot az exportált osztályokat tartalmazó fejlécfájlok elejére és végére:

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

Ezek a sorok biztosítják, hogy a belsőleg használt vagy az osztályokhoz hozzáadott MFC-változók exportálása (vagy importálása) az MFC-bővítmény DLL-éből történjen. Például, amikor egy osztályt származtat DECLARE_DYNAMIC-val, a makró kibővül, és egy CRuntimeClass tagváltozót ad az osztályhoz. Ha kihagyja ezt a négy sort, a DLL helytelen fordítást vagy csatolást okozhat, vagy hibát okozhat, ha az ügyfélalkalmazás a DLL-hez kapcsolódik.

A DLL létrehozásakor a linker a DEF fájlt használja egy export (.exp) fájl és egy importálási tárfájl (.lib) létrehozásához. A linker ezután az exportfájl használatával hozza létre a DLL-fájlt. Azok a végrehajtható fájlok, amelyek implicit módon hivatkoznak a DLL-re, az importálási kódtárra hivatkoznak az építésekor.

Fontos tudni, hogy az MFC önállóan DEF-fájlokat használ az MFCx0.dllosztályok és függvények exportálásához.

Mit kíván tenni?

Miről szeretne többet tudni?

Lásd még

Exportálás DLL-ből