Punti di ingresso esportati di funzione DLL

Per le funzioni esportate di una DLL, utilizzare la macro di AFX_MANAGE_STATE per gestire lo stato complessivo appropriato quando si passano dal modulo DLL alla DLL dell'applicazione chiamante.

Una volta chiamata, questa macro imposta pModuleState, un puntatore a una struttura di AFX_MODULE_STATE contenente i dati globali del modulo, come effettiva stato del modulo per il resto dell'ambito contenitore della funzione.Limitare l'ambito contenere la macro, un'efficace stato precedente del modulo automaticamente viene ripristinato.

Questo passaggio si ottiene creando un'istanza con classe di AFX_MODULE_STATE nello stack.Nel costruttore, questa classe ottiene un puntatore allo stato corrente del modulo e lo archivia in una variabile membro e quindi impostare pModuleState come nuovo efficace stato del modulo.Nel rispettivo distruttore, questa classe viene ripristinato il puntatore memorizzato nella variabile membro come effettiva stato del modulo.

Se si dispone di una funzione esportata, ad esempio una che avvia una finestra di dialogo nella DLL, è necessario aggiungere il codice seguente all'inizio della funzione:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

Ciò consente di scambiare lo stato corrente del modulo con lo stato restituito da AfxGetStaticModuleState fino alla fine dell'ambito corrente.

I problemi con le risorse nelle DLL si verificheranno se la macro di AFX_MANAGE_STATE non viene utilizzata.Per impostazione predefinita, MFC utilizza l'handle di risorsa dell'applicazione principale caricare il modello di risorse.Questo modello viene effettivamente archiviato nella DLL.La causa principale è che le informazioni sullo stato del modulo MFC non è stato passato dalla macro di AFX_MANAGE_STATE .L'handle delle risorse vengono recuperate dallo stato del modulo MFC.Non passare lo stato del modulo consente a un handle di risorsa errato per essere utilizzato.

AFX_MANAGE_STATE non deve essere inserito in ogni funzione nella DLL.Ad esempio, InitInstance può essere chiamato da codice MFC nell'applicazione senza AFX_MANAGE_STATE perché MFC automaticamente scorre lo stato del modulo prima di InitInstance quindi le opzioni di nuovo dopo il completamento di InitInstance .Lo stesso vale per tutti i gestori della mappa messaggi.Le DLL regolari effettivamente dispongono di una routine della finestra di master speciale che passa automaticamente lo stato del modulo prima di gestire qualsiasi messaggio.

Vedere anche

Concetti

Gestire i dati dello stato dei moduli MFC