Condividi tramite


DLL MFC regolari collegate a MFC in modo dinamico

Una NORMALE DLL MFC collegata dinamicamente a MFC è una DLL che usa internamente MFC e le funzioni esportate nella DLL possono essere chiamate da eseguibili MFC o non MFC. Come descritto dal nome, questo tipo di DLL viene compilato usando la versione della libreria a collegamento dinamico di MFC (nota anche come versione condivisa di MFC). Le funzioni vengono in genere esportate da una normale DLL MFC usando l'interfaccia C standard.

È necessario aggiungere la AFX_MANAGE_STATE macro all'inizio di tutte le funzioni esportate nelle normali DLL MFC che si collegano dinamicamente a MFC per impostare lo stato del modulo corrente su quello per la DLL. A tale scopo, aggiungere la riga di codice seguente all'inizio delle funzioni esportate dalla DLL:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

Una NORMALE DLL MFC collegata a MFC include le funzionalità seguenti:

  • Si tratta di un nuovo tipo di DLL introdotto da Visual C++ 4.0.

  • L'eseguibile client può essere scritto in qualsiasi linguaggio che supporti l'uso di DLL (C, C++, Pascal, Visual Basic e così via); non deve essere un'applicazione MFC.

  • A differenza della DLL MFC collegata in modo statico, questo tipo di DLL è collegato dinamicamente alla DLL MFC (nota anche come DLL MFC condivisa).

  • La libreria di importazione MFC collegata a questo tipo di DLL è la stessa usata per le DLL o le applicazioni dell'estensione MFC usando la DLL MFC: MFCxx(D).lib.

Una NORMALE DLL MFC collegata a MFC presenta i requisiti seguenti:

  • Queste DLL vengono compilate con _AFXDLL definite, proprio come un eseguibile collegato dinamicamente alla DLL MFC. Ma _USRDLL è definito anche, proprio come una normale DLL MFC collegata in modo statico a MFC.

  • Questo tipo di DLL deve creare un'istanza di una CWinAppclasse derivata da .

  • Questo tipo di DLL usa l'oggetto DllMain fornito da MFC. Inserire tutto il codice di inizializzazione specifico della InitInstance DLL nella funzione membro e nel codice di terminazione in ExitInstance come in una normale applicazione MFC.

Poiché questo tipo di DLL usa la versione della libreria a collegamento dinamico di MFC, è necessario impostare in modo esplicito lo stato del modulo corrente su quello per la DLL. A tale scopo, usare la macro AFX_MANAGE_STATE all'inizio di ogni funzione esportata dalla DLL.

le DLL MFC regolari devono avere una CWinAppclasse derivata da -e un singolo oggetto della classe dell'applicazione, così come un'applicazione MFC. Tuttavia, l'oggetto CWinApp della DLL non dispone di un pump di messaggi principale, così come l'oggetto CWinApp di un'applicazione.

Si noti che il CWinApp::Run meccanismo non si applica a una DLL, perché l'applicazione è proprietaria dell'elemento message pump principale. Se la DLL visualizza finestre di dialogo senza modalità o ha una finestra cornice principale di propria proprietà, il message pump principale dell'applicazione deve chiamare una routine esportata dll che chiama CWinApp::PreTranslateMessage.

Inserire tutta l'inizializzazione specifica della CWinApp::InitInstance DLL nella funzione membro come in una normale applicazione MFC. La CWinApp::ExitInstance funzione membro della CWinApp classe derivata viene chiamata dalla funzione fornita DllMain da MFC prima che la DLL venga scaricata.

È necessario distribuire le DLL condivise MFCx0.dll e Msvcr*0.dll (o file simili) con l'applicazione.

Una DLL collegata dinamicamente a MFC non può anche collegarsi staticamente a MFC. Le applicazioni si collegano a normali DLL MFC collegate dinamicamente a MFC come qualsiasi altra DLL.

I simboli vengono in genere esportati da una normale DLL MFC usando l'interfaccia C standard. La dichiarazione di una funzione esportata da una NORMALE DLL MFC è simile alla seguente:

extern "C" __declspec(dllexport) MyExportedFunction( );

Tutte le allocazioni di memoria all'interno di una normale DLL MFC devono rimanere all'interno della DLL; la DLL non deve passare o ricevere dal file eseguibile chiamante uno dei seguenti:

  • puntatori a oggetti MFC

  • puntatori alla memoria allocata da MFC

Se è necessario eseguire una delle operazioni precedenti o se è necessario passare oggetti derivati da MFC tra l'eseguibile chiamante e la DLL, è necessario compilare una DLL di estensione MFC.

È sicuro passare puntatori alla memoria allocati dalle librerie di runtime C tra un'applicazione e una DLL solo se si crea una copia dei dati. Non è necessario eliminare o ridimensionare questi puntatori o usarli senza creare una copia della memoria.

Quando si compila una NORMALE DLL MFC che si collega dinamicamente a MFC, è necessario usare la macro AFX_MANAGE_STATE per cambiare correttamente lo stato del modulo MFC. A tale scopo, aggiungere la riga di codice seguente all'inizio delle funzioni esportate dalla DLL:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

La macro AFX_MANAGE_STATE non deve essere usata nelle normali DLL MFC collegate in modo statico a MFC o nelle DLL dell'estensione MFC. Per altre informazioni, vedere Gestione dei dati sullo stato dei moduli MFC.

Per un esempio di come scrivere, compilare e usare una NORMALE DLL MFC, vedere l'esempio DLLScreenCap. Per altre informazioni sulle normali DLL MFC collegate in modo dinamico a MFC, vedere la sezione intitolata "Conversione di DLLScreenCap in collegamento dinamico con la DLL MFC" nell'astrazione per l'esempio.

Cosa vuoi fare?

Scegliere l'argomento su cui visualizzare maggiori informazioni

Vedi anche

Tipi di DLL