¿Por qué no llamar a FreeLibrary función de punto de entrada?
-
19-09-2019 - |
Pregunta
Estoy escribiendo un archivo DLL que tiene que llamar a una DLL separada de forma dinámica en múltiples ocasiones. Me gustaría mantener el destinatario de la llamada carga y luego simplemente descargarlo cuando se descarga mi DLL. Pero de acuerdo con Microsoft, que es una mala idea .
La función de punto de entrada sólo debe realizar tareas de inicialización simples y no debe llamar a cualquier otro archivo DLL de carga o de terminación de funciones. por ejemplo, en la función de punto de entrada, usted no debe, directa o indirectamente llamar a la función LoadLibrary o la LoadLibraryEx función. Adicionalmente, no debe llamar a la FreeLibrary función cuando el proceso está de terminación.
Aquí está el código erróneo. ¿Puede alguien explicar por qué no hay que llamar a LoadLibrary y FreeLibrary del punto de entrada de mi 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;
}
Solución
Creo que he encontrado la respuesta .
La función de punto de entrada debería realizar sólo la inicialización simple o tareas de terminación. No debe llamar LoadLibrary o LoadLibraryEx función (o una función que llama estas funciones), porque esto puede crear lazos de dependencia en el archivo DLL orden de carga. Esto puede resultar en una DLL que se utiliza antes de que el sistema tiene ejecutado su código de inicialización. Del mismo modo, la función de punto de entrada No debe llamar a la función FreeLibrary (O una función que llama a FreeLibrary) durante la terminación del proceso, porque esto puede resultar en un DLL que se utiliza después de que el sistema ha ejecutado su código de terminación.
Otros consejos
No se puede llamar a LoadLibrary desde su punto de entrada debido a la función DllMain se ejecuta dentro de un bloqueo del sistema operativo cargador y cualquier intento de adquirir de nuevo que el bloqueo de cargador (por ejemplo, llamando a LoadLibrary) resultará en un punto muerto.
No hacer nada importante en el interior de DLLMain. Seriamente. Llamar a FreeLibrary es aún peor porque va solamente a veces punto muerto, si sucede que sus decrementos libres refcount a cero y la biblioteca es realmente liberados.