Domande frequenti sulla DLL

Una DLL MFC può creare più thread?

Tranne durante l'inizializzazione, una DLL MFC può creare in modo sicuro più thread, purché usi le funzioni di archiviazione locale del thread Win32 , ad esempio TlsAlloc , per allocare l'archiviazione locale del thread. Tuttavia, se una DLL MFC usa __declspec(thread) per allocare l'archiviazione locale del thread, l'applicazione client deve essere collegata in modo implicito alla DLL. Se l'applicazione client si collega in modo esplicito alla DLL, la chiamata a LoadLibrary non caricherà correttamente la DLL. Per altre informazioni sulle variabili locali del thread nelle DLL, vedere thread.

Una DLL MFC che crea un nuovo thread MFC durante l'avvio smetterà di rispondere quando viene caricata da un'applicazione. Ciò include ogni volta che viene creato un thread chiamando AfxBeginThread o CWinThread::CreateThread all'interno:

  • Oggetto InitInstance di un CWinAppoggetto derivato da in una normale DLL MFC.

  • Funzione fornita DllMain o RawDllMain in una normale DLL MFC.

  • Funzione fornita DllMain o RawDllMain in una DLL di estensione MFC.

Un'applicazione multithreading può accedere a una DLL MFC in thread diversi?

Le applicazioni multithreading possono accedere alle normali DLL MFC che si collegano dinamicamente a DLL di estensione MFC e MFC da thread diversi. Un'applicazione può accedere alle normali DLL MFC che si collegano in modo statico a MFC da più thread creati nell'applicazione.

Esistono classi o funzioni MFC che non possono essere usate in una DLL MFC?

Le DLL di estensione usano la CWinAppclasse derivata da -dell'applicazione client. Non devono avere la propria CWinAppclasse derivata.

Le DLL MFC normali devono avere una classe derivata da - CWinAppe un singolo oggetto della classe dell'applicazione, così come un'applicazione MFC. A differenza dell'oggetto CWinApp di un'applicazione, l'oggetto CWinApp della DLL non dispone di una pompa di messaggi principale.

Si noti che poiché il CWinApp::Run meccanismo non si applica a una DLL, l'applicazione è proprietaria della pompa di messaggi principale. Se la DLL apre 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 dalla DLL, che a sua volta chiama la CWinApp::PreTranslateMessage funzione membro dell'oggetto applicazione della DLL.

Quali tecniche di ottimizzazione è consigliabile usare per migliorare le prestazioni dell'applicazione client durante il caricamento?

Se la DLL è una NORMALE DLL MFC collegata in modo statico a MFC, la modifica viene modificata in una normale DLL MFC collegata dinamicamente a MFC riduce le dimensioni del file.

Se la DLL ha un numero elevato di funzioni esportate, usare un file con estensione def per esportare le funzioni (invece di usare __declspec(dllexport)) e usare l'attributo NONAME del file def in ogni funzione esportata. L'attributo NONAME fa sì che solo il valore ordinale e non il nome della funzione venga archiviato nella tabella di esportazione della DLL, riducendo così le dimensioni del file.

Le DLL collegate in modo implicito a un'applicazione vengono caricate al caricamento dell'applicazione. Per migliorare le prestazioni durante il caricamento, provare a dividere la DLL in DLL diverse. Inserire tutte le funzioni necessarie all'applicazione chiamante immediatamente dopo il caricamento in una DLL e collegare implicitamente l'applicazione chiamante a tale DLL. Inserire immediatamente le altre funzioni non necessarie all'applicazione chiamante in un'altra DLL e collegare esplicitamente l'applicazione a tale DLL. Per altre informazioni, vedere Collegare un eseguibile a una DLL.

C'è una perdita di memoria nella mia NORMALE DLL MFC, ma il codice sembra corretto. Come è possibile trovare la perdita di memoria?

Una possibile causa della perdita di memoria è che MFC crea oggetti temporanei usati all'interno delle funzioni del gestore di messaggi. Nelle applicazioni MFC questi oggetti temporanei vengono eliminati automaticamente nella CWinApp::OnIdle() funzione chiamata tra i messaggi di elaborazione. Tuttavia, nelle DLL (Dynamic Link Librarie) MFC la OnIdle() funzione non viene chiamata automaticamente. Di conseguenza, gli oggetti temporanei non vengono puliti automaticamente. Per pulire gli oggetti temporanei, la DLL deve chiamare OnIdle(1) periodicamente.