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;
}
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top