Je bent nu offline; er wordt gewacht tot er weer een internetverbinding is

INFO: _declspec(dllimport) & _declspec(dllexport) in Code gebruiken

BELANGRIJK: Dit artikel is vertaald door de vertaalmachine software van Microsoft in plaats van door een professionele vertaler. Microsoft biedt u professioneel vertaalde artikelen en artikelen vertaald door de vertaalmachine, zodat u toegang heeft tot al onze knowledge base artikelen in uw eigen taal. Artikelen vertaald door de vertaalmachine zijn niet altijd perfect vertaald. Deze artikelen kunnen fouten bevatten in de vocabulaire, zinsopbouw en grammatica en kunnen lijken op hoe een anderstalige de taal spreekt en schrijft. Microsoft is niet verantwoordelijk voor onnauwkeurigheden, fouten en schade ontstaan door een incorrecte vertaling van de content of het gebruik ervan door onze klanten. Microsoft past continue de kwaliteit van de vertaalmachine software aan door deze te updaten.

De Engelstalige versie van dit artikel is de volgende: 132044
Dit artikel is gearchiveerd. Het wordt aangeboden in de huidige vorm en wordt niet meer bijgewerkt.
Samenvatting
Dit artikel vormt een aanvulling op de informatie die in het volgende artikelin de Microsoft Knowledge Base:
107501 INFO: __export vervangen door __declspec in Visual C++, 32-bits
Dit artikel bespreekt de voordelen en de mechanismen van_declspec(DllImport) en _declspec(dllexport) in uw toepassing.
Meer informatie
De 32-bits editie van Visual C++ gebruikt _declspec(dllimport) en_declspec(dllexport) vervangen door het sleutelwoord __export is eerder gebruikt in16-bits versies van Visual C++.

U hoeft niet te gebruiken _declspec(dllimport) voor uw code te compilerengoed, maar hierdoor kan dus de compiler betere code genereren. Decompiler kan zeker bekend betere code genereren ofeen functie in een DLL of niet bestaat, zodat de compiler kan produceren die codeseen niveau van gerealiseerd die normaliter aanwezig zijn in een functie overslaande aanroep die de grens van een DLL wordt gepasseerd.

Met de juiste.DEF bestand uitvoer sectie _declspec(dllexport) is nietvereist. _declspec(dllexport) is toegevoegd voor een eenvoudige manier om te exporterenfuncties van een.EXE of.DLL zonder een.DEF-bestand.

De rest van dit artikel biedt een tamelijk Low grondigbespreking van deze problemen.

De Win32-Portable Executable File-indeling is ontworpen om het aantalpagina's die moeten worden gewijzigd om invoer te corrigeren. Hiertoe plaatst alle deimporteren van adressen voor elk programma in één plaats het adres importerenTabel. Hiermee wordt de lader van slechts één of twee pagina's alstoegang tot deze invoer.

_Declspec(dllimport) voor functieaanroepen wordt gebruikt

In het volgende codevoorbeeld wordt ervan uitgegaan func1 is een functie die zich bevindt in eenDLL-bestand van het.EXE-bestand dat de main() functie bevat.

Zonder _declspec(dllimport) deze code gegeven:
void main(void) {    func1();}				
de compiler genereert de code die er zo uit:
call func1				
en de linker vertaalt de aanroep naar iets dergelijks:
call 0x4000000         ; The address of 'func1'.				
Als 'func1' in een ander DLL-bestand bestaat, kan niet de linker dit rechtstreeks oplossenomdat er geen manier om te weten wat het adres van de 'func1' is. In de 16-bitsomgevingen, de linker wordt dit adres code toegevoegd aan een lijst in de.EXEdat zou de lader patch tijdens runtime met het juiste adres. In 32-bitsomgevingen, de linker genereert een thunk waarvoor het weet deadres. De thunk ziet er zo uit:
   0x40000000:    jmp DWORD PTR __imp_func1				
__Imp_func1 is hier het adres voor de sleuf van de func1 in het adres importerentabel van de.EXE-bestand. De adressen worden dus de linker bekend. DeLoader alleen bijwerken is het.EXE-bestand importeren tabel tijdens het ladenvoor alles goed werkt.

Met behulp van _declspec(dllimport) dus beter omdat het beter is als delinker genereert een thunk niet als het niet aan. Thunks maken degrotere code (op RISC-systemen kan zijn verschillende instructies) ende cache prestaties nadelig beïnvloeden. Als u de compiler is de functie ineen DLL kan het een indirecte oproep genereren voor u.

Nu deze code:
__declspec(dllimport) void func1(void);void main(void) {    func1();}				
Deze opdracht genereert:
call DWORD PTR __imp_func1				
Er is geen thunk en geen jmp instructie, zodat de code kleiner is ensneller.

Anderzijds, voor het aanroepen van functies in een DLL-bestand, hoeft u hebtGebruik een indirecte oproep. Weet u al een functie adres. Tijd enruimte vereist zijn voor het laden en opslaan van het adres van de functie voordat eenindirecte oproep, zodat een directe aanroep altijd sneller en kleiner. Wilt u alleen__declspec(dllimport) gebruiken bij het aanroepen van functies van DLL-bestand van buitenhet DLL-bestand zelf. Gebruik geen __declspec(dllimport) op functies in een DLL-bestandbij het samenstellen van die DLL.

_Declspec(dllexport) gebruiken

__Export Microsoft geïntroduceerd in de compiler van 16-bits versie zodat dede compiler automatisch genereren van namen exporteren en plaats deze in een.LIB-bestand. Dit.LIB-bestand kan vervolgens worden gebruikt als een statische.LIB naareen DLL-bestand koppelen.

Microsoft __declspec(dllexport) blijven deze gemak toegevoegd. Dedoel is de richtlijn exporteren toevoegen aan het bestand, zodat u niet hoefteen.DEF-bestand.

Dit gebruiksgemak is duidelijkst wanneer bij het exporteren van C++ versierdfunctienamen. Er is geen standaard specificatie voor naamwijzigingen, zode naam van een geëxporteerde functie kan tussen compiler versies veranderen. Alsu _declspec(dllexport), DLL en afhankelijke compileren.EXE-bestandenalleen naar de rekening voor naamgeving conventie wijzigingen noodzakelijk is.

Veel exporteren richtlijnen zoals rangtelwoorden, NAAMLOOS of PRIVAATRECHTELIJKE gemaaktalleen in een.DEF-bestand en er is geen manier om deze kenmerken opgevenzonder een.DEF-bestand. Echter met behulp van _declspec(dllexport) inmet een.DEF-bestand veroorzaakt geen bouwen fouten.

Als een verwijzing zoeken via het Win32-WINBASE.H header-bestand. Het bevatVoorbeelden van de beste __declspec(dllexport) en __declspec(dllimport)gebruik.

Met behulp van _declspec(dllexport) en _declspec(dllimport) van gegevens

Voor de gegevens is met behulp van _declspec(dllimport) een gemak itemverwijdert een laag basisserver. Wanneer u gegevens importeert uit een DLL welhebben via de tabel importeren. De Win32-dagen vóór_declspec(DllImport), die dit betekende moest u niet moet vergeten een extra beveiligingsniveaubasisserver toegang tot gegevens geëxporteerd vanuit de DLL:
// project.h#ifdef _DLL     // If accessing the data from inside the DLL   ULONG ulDataInDll;else            // If accessing the data from outside the DLL   ULONG *ulDataInDll;#endif				
U zou vervolgens exporteren van de gegevens in uw.DEF-bestand:
// project.defLIBRARY projectEXPORTS    ulDataInDll   CONSTANT				
en toegang tot buiten het DLL-bestand:
if (*ulDataInDll == 0L) {   // Do stuff here}				
Wanneer u de gegevens markeren als __declspec(dllimport), de compiler automatischde basisserver code voor u genereert. U hoeft niet meer bangde bovenstaande stappen. Zoals eerder vermeld, geen _declspec(dllimport) gebruikenverklaring over de gegevens die bij het maken van het DLL-bestand. Functies binnen het DLL-bestandde tabel importeren niet gebruikt voor toegang tot het object. Daaromu hebt geen extra beveiligingsniveau basisserver aanwezig.

Om automatisch de gegevens van het DLL-bestand exporteert, gebruikt u deze declaratie:
__declspec(dllexport) ULONG ulDataInDLL;				

Met een.DEF-bestand

Als u kiest voor __declspec(dllimport) samen met een.DEF-bestand uWijzig de.DEF-bestand om gegevens te gebruiken in plaats van de constante verminderen dewaarschijnlijkheid dat onjuiste code een probleem veroorzaakt:
// project.defLIBRARY projectEXPORTS    ulDataInDll   DATA				
De volgende grafiek ziet u waarom:
Keyword     Emits in the import lib     ExportsCONSTANT    __imp_ulDataInDll           ulDataInDll            __ulDataInDllDATA        __imp_ulDataInDll           ulDataInDll				
De __imp_ versie _declspec (dllimport) en constante lijsten ende naam die in de.LIB DLL-bibliotheek importeren die is gemaakt optoestaan dat expliciete koppelen. Lijsten met _declspec(dllimport) en de gegevens alleen het__imp_ versie van de naam.

Als u een constante gebruikt, kan een van de volgende codeconstructies worden gebruikttoegang tot de ulDataInDll:
__declspec(dllimport) ULONG ulDataInDll; /*prototype*/    if (ulDataInDll == 0L)   /*sample code fragment*/ 				
- of -
ULONG *ulDataInDll;      /*prototype*/ if (*ulDataInDll == 0L)  /*sample code fragment*/ 				
Echter, als u gegevens in uw.DEF-bestand alleen code is gecompileerd met devolgende definitie kan toegang tot de variabele ulDataInDll:
__declspec(dllimport) ULONG ulDataInDll;if (ulDataInDll == 0L)   /*sample code fragment*/ 				
Meer riskante constante is omdat als u extra beveiligingsniveau gebruikenbasisserver, kan u mogelijk de Import adrestabel openenverwijzing naar de variabele--niet de variabele zelf. Dit type probleemvaak kunt manifest als een toegangsfout omdat de tabel importerenis momenteel alleen-lezen gemaakt door Microsoft compiler en linkers.

De huidige Visual C++-koppelfunctie waarschuwingsbericht een als u deze constante in zietde.DEF-bestand voor deze kwestie. De enige echte reden gebruikenCONSTANTE is als u een bestand niet opnieuw kunt compileren waar het header-bestandniet lijst dllimport op prototype van de.
Referenties
De Visual C++ Books Online bieden een aanzienlijke hoeveelheid documentatieop de dllexport en dllimport kenmerken storage class. Dit omvat"De kenmerken dllexport en dllimport" en "met dllimport endllexport in C++ ' onderwerpen in het hoofdstuk "Microsoft-specifieke parameters" vanC++ Language Reference en de onderwerpen 'Symbolen exporteren' in deHoofdstuk "Dll voor Win32 maken" van het programmeren technieken.Zoek ' Verwante onderwerpen ' voor een uitgebreide lijst Books Online voor'dllimport' of 'dllexport'.

Zie de volgende artikelen in de Microsoft voor meer informatie.Knowledge Base:
90530 Gegevens exporteren uit een DLL-bestand of een toepassing
107501 INFO: __export vervangen door __declspec in Visual C++, 32-bits

Waarschuwing: dit artikel is automatisch vertaald

Eigenschappen

Artikel-id: 132044 - Laatst bijgewerkt: 12/04/2015 11:35:04 - Revisie: 4.0

Microsoft Visual C++ 2.0 Professional Edition, Microsoft Visual C++ 5.0 Enterprise Edition, Microsoft Visual C++ 5.0 Professional Edition

  • kbnosurvey kbarchive kbcode kbcompiler kbinfo kbmt KB132044 KbMtnl
Feedback