Funzioni di chiamata dinamici in DLL

April 26

Funzioni di chiamata dinamici in DLL


Una libreria di collegamento dinamico o DLL, consente a un'applicazione per caricare solo il codice eseguibile minimo necessario in memoria in fase di esecuzione. Ogni volta che il programma chiama una funzione in una DLL, il sistema operativo carica la DLL in memoria in base alle specifiche del programmatore. Finché il programma in esecuzione non fa riferimento una funzione DLL, che DLL non deve occupare spazio. Ciò consente di risparmiare un sacco di risorse e aumenta le prestazioni in fase di esecuzione. Se la libreria fosse statica, tutto il codice biblioteca saranno allegati al codice eseguibile del programma principale e il programma di gigante avrebbe dovuto rimanere in memoria per l'intera fase di esecuzione. La versione Unix o Linux di una DLL di Windows è una libreria condivisa, costruita di conseguenza con l'estensione ".so." Windows, Unix e Linux hanno convenzioni specifiche per accedere alle funzioni di DLL o librerie condivise.

Export DLL di Windows oggetti utilizzando dllexport Chiave

Per effettuare una funzione di funzione, classe, elemento di dati o membro della classe accessibili al programma di Windows chiama, è necessario esportare prima. Una classe o una funzione possono essere esportati nel corso della sua definizione utilizzando la parola chiave "__declspec (dllexport)" prima della funzione, classe o nome di variabile, come segue:

Void __declspec (dllexport) MyClass: CObjectName pubblico {... ..}

Nel file di intestazione DLL, mettere questa parola chiave prima che il nome della funzione in una dichiarazione prototipo. La parola chiave "__declspec (dllexport)" memorizza i nomi delle funzioni nella tabella di esportazione della DLL. Per economizzare lo spazio che occupa questa tabella, utilizzare i numeri ordinali invece dei nomi delle funzioni.

Export DLL di Windows oggetti attraverso il modulo file di definizione

In alternativa alla parola "__declspec (dllexport)," creare un file di definizione del modulo in cui si afferma il nome della libreria, una descrizione facoltativa ed elenca i nomi delle funzioni, classi e le variabili di dati nella DLL con valori ordinali opzionali. Il valore ordinale di una funzione varia da 1 a N, dove N è il numero di funzioni nella DLL. Il file di definizione del modulo ha il "DEF". Seguendo l'estensione è un esempio di un file di definizione del modulo, o un file DEF:

BIBLIOTECA ReportWriter
DESCRIZIONE Questa libreria dinamica contiene le funzionalità generatore di report di MyProduct.
RPT_setup @ 1
RPT_design @ 2
RPT_run @ 3
RPT_print @ 4

Se si crea un Foundation Class DLL Microsoft utilizzando Creazione guidata applicazione di Visual Studio, la procedura guidata genera un file DEF scheletro per la DLL e aggiungerlo al progetto. Aggiungere le voci per le funzioni di DLL in questo file DEF per esportarli. Il formato del prototipo di funzione utilizzata dal programma chiamante deve corrispondere al formato delle voci di funzione nel file DEF. Utilizzare definizioni in entrambi i luoghi, o, definizioni specifiche del generatore di parser generati in entrambi i luoghi in modo coerente.

Importazione ed esportazione di estensione DLL

Una DLL di estensione Microsoft Foundation Class consiste tipicamente di classi riutilizzabili derivate da tipi di classe MFC esistenti. Sono costruiti utilizzando una versione DLL di MFC, e possono essere richiamati dalle applicazioni e le DLL create utilizzando questa versione condivisa di MFC. Per esportare le classi in DLL di estensione, utilizzare la macro "AFX_EXT_CLASS" prima del nome della classe in questo modo:
Classe AFX_EXT_CLASS CMyViewClass: CView pubblico
{
// Corpo Class
};
Se si utilizza un file DEF, aggiungere il seguente codice macro all'inizio e alla fine del file di intestazione DLL esteso:

undef AFX_DATAdefine AFX_DATA AFX_EXT_DATA

// <Corpo di file di intestazione per la DLL estesa>

undef AFX_DATAdefine AFX_DATA

Queste direttive del preprocessore assicurarsi che le variabili MFC e derivazioni ed esportati dalla DLL esteso.

Importazione di funzioni DLL

L'altro lato di oggetti esportatori DLL loro è l'importazione in applicazioni che utilizzano il "__declspec (dllimport)" parola chiave.

Funzioni di esportazione C per l'utilizzo in eseguibili C o C ++

Se il programma chiamante o la funzione è scritto in C ++, utilizzare la direttiva del preprocessore "extern C" nell'intestazione DLL se le funzioni DLL sono scritti in C.

Ecco un esempio:
// MyDLLFunctions.h

ifdef __cplusplus

Extern "C" {

finisci se

declspec (dllimport) MyFunc01 void ();
declspec (dllimport) MyFunc02 void ();

ifdef __cplusplus

} // codice di chiusura per la direttiva "extern C"

finisci se

Come alternativa a specificare la direttiva "Esterno C" all'interno della intestazione DLL, è possibile includere il file di intestazione DLL con un C "" Esterno "" wrapper condizionale, come segue:

ifdef __cplusplus

Extern "C" {

endifinclude "DllPath \ MyDLLFunctions.h" ifdef __cplusplus

} // codice di chiusura per la direttiva "extern C"

finisci se