Perché non chiamare FreeLibrary dalla funzione di punto di ingresso?
-
19-09-2019 - |
Domanda
Sto scrivendo una DLL che ha bisogno di chiamare una DLL separata in modo dinamico più volte. Vorrei mantenere il chiamato caricato e poi basta scaricarlo quando la mia DLL viene scaricata. Ma secondo Microsoft, che è un cattiva idea .
La funzione di punto di ingresso solo dovrebbe svolgere attività di inizializzazione semplici e non dovrebbe chiamare qualsiasi altro DLL funzioni di carico o di terminazione. Per esempio, in funzione del punto di ingresso, non si dovrebbe, direttamente o indirettamente chiamare la funzione LoadLibrary o la Funzione LoadLibraryEx. Inoltre, Non si dovrebbe chiamare il FreeLibrary funzione quando il processo è terminazione.
Ecco il codice incriminato. Qualcuno può spiegare perché non dovrei chiamare LoadLibrary e FreeLibrary dal punto di ingresso di mio DLL?
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call) {
case DLL_PROCESS_DETACH :
if (hLogLib != NULL) FreeLibrary(hLogLib);
break;
}
return TRUE;
}
Soluzione
Credo di aver trovato la risposta .
La funzione di punto di ingresso dovrebbe eseguire solo inizializzazione semplice o compiti di terminazione. Non deve chiamare il LoadLibrary o LoadLibraryEx funzione (o una funzione che chiama queste funzioni), perché questo può creare loop di dipendenza nella DLL dell'ordine di caricamento. Questo può tradursi in una DLL in uso prima che il sistema ha eseguito il suo codice di inizializzazione. Allo stesso modo, la funzione di punto di ingresso non deve chiamare la funzione FreeLibrary (O una funzione che chiama FreeLibrary) durante la terminazione dei processi, perché questo può causare una DLL in uso dopo che il sistema ha eseguito la sua codice di terminazione.
Altri suggerimenti
Non è possibile chiamare LoadLibrary dal vostro punto di ingresso in quanto la funzione DllMain viene eseguito all'interno di un blocco del sistema operativo caricatore e qualsiasi tentativo di riacquisire che il blocco del caricatore (per esempio, chiamando LoadLibrary) si tradurrà in stallo.
Non fare qualche cosa di importante all'interno di DLLMain. Sul serio. La chiamata FreeLibrary è anche peggio perché sarà solo a volte situazione di stallo, se accade che i decrementi libere refcount a zero e la biblioteca è in realtà liberati.