2012-01-30 16 views
12

Ho usato molte finestre di dialogo modali e hanno funzionato bene senza l'uso di AFX_MANAGE_STATE, ma di recente stavo lavorando a un progetto diverso in cui le dll delle risorse sono diverse dal lancio dll. Ho navigato in rete e ho scoperto la riga sopra e quando l'ho inserita prima di avviare la finestra di dialogo, ha funzionato. Immagino che forse dal momento che abbiamo dll differenti, abbiamo bisogno di caricare lo stato della DLL principale per avviare la finestra di dialogo, ma non ne sono sicuro. Non sono stato in grado di trovare una buona spiegazione da nessuna parte su Internet. Qualcuno potrebbe spiegare in termini semplici che cosa fa AFX_MANAGE_STATE e perché improvvisamente ho dovuto usarlo.Che cosa fa AFX_MANAGE_STATE (AfxGetStaticModuleState()) esattamente

Grazie.

+0

Nota tecnica Microsoft 058, Implementazione stato modulo MFC, contiene alcune informazioni aggiuntive sull'utilizzo di AFX_MANAGE_STATE. https://msdn.microsoft.com/en-us/library/vstudio/ft1t4bbc(v=vs.100).aspx anche se potrebbe essere un po 'datato. –

risposta

17

Ogni .exe e .dll ha un handle di risorse interno, che punta alle finestre di dialogo e ad altre risorse. Se si chiama una funzione nella DLL, l'handle della risorsa corrente punta alle risorse nell'exe, che è errato e deve essere modificato nelle risorse della DLL.

Questo è ciò che fa AFX_MANAGE_STATE.

14

AFX_MANAGE_STATE è una macro che chiama la funzione di risorsa in modo che la risorsa venga cercata solo in questa DLL e non l'EXE/DLL da cui viene chiamata la funzione specifica. Questa macro fa sì che la classe AFX_MAINTAIN_STATE venga messa in pila. Questa classe, al termine della funzione, ripristina la ricerca della risorsa, in modo che EXE/DLL che ha chiamato questa funzione esportata ottenga la ricerca delle risorse.

In termini C++:

// Some exported function that launches GUI or uses other resources 
int GetSomething() 
{ 
    AFX_MANAGE_STATE(); 
    ... 
} 

sarebbe qualcosa di simile (non esattamente):

int GetSomething() 
{ 
     SetResourceSearchingToThisDLL(); 

     AFX_MAINTAIN_STATE state_RAII; 

     //Use resource 

     // Compiler will put destroctor call for state_RAII object here 
     // which will mean AFX_MAINTAIN_STATE::~AFX_MAINTAIN_STATE() 
     // And that would call something like: 
     ResetResourceSearching(); 
} 

L'utilizzo di questa macro, entro lo stesso stack di chiamate DLL abituato male a nessuno, dal momento che Resource-Ricerca ha un contatore di utilizzo, che tornerà al chiamante (risorsa DLL/EXE) solo se raggiunge 0.

È importante notare che, no ogni DLL MFC deve usare questa macro. È solo se la DLL viene caricata dal client non MFC, può essere da un client C, un'applicazione basata su console C++, client .NET ecc. (Sì, può essere anche client dell'applicazione Windows MFC).

Se il file EXE e DLL sono realizzati in MFC, utilizzando la stessa versione di MFC/Compiler/linker e un oggetto CWinApp, non è necessario utilizzare questa macro.

Problemi correlati