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;
}
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top