2010-08-16 20 views
19

Si utilizo la API de Win32 LoadLibrary para cargar la misma DLL 3 veces seguidas, debería devolver 3 identificadores distintos y las funciones de cada biblioteca deberían tener todas direcciones diferentes correctas? (¿O hace algo "inteligente" y detecta si el dll ya se ha cargado para el proceso y solo apunta al mismo módulo?)¿LoadLibrary crea instancias distintas?

Respuesta

21

Hace algo inteligente. Windows mantiene un recuento de referencias para cada DLL cargada a través de LoadLibrary. Es por eso que debe llamar a FreeLibrary una vez por cada llamada LoadLibrary correspondiente. Suponiendo que no libera la DLL primero, cada llamada a LoadLibrary le dará el mismo asa.

A partir de la documentación de MSDN para FreeLibrary:

Cada proceso mantiene un recuento de referencia para cada módulo de biblioteca cargada. Este recuento de referencias se incrementa cada vez que se llama LoadLibrary y se decrementa cada vez que se llama a FreeLibrary.

+8

Tenga en cuenta que es posible obtener varias instancias si utiliza diferentes rutas resolviendo en la misma DLL, pero la mayoría de las personas no se topan con esto. – Michael

+0

Buena captura. Gracias, Michael. –

+1

Mi política general es nunca llamar a FreeLibrary. Es bueno saber que el usuario puede llamar a LoadLibrary varias veces en la misma sin que se filtre más de lo necesario. (¿Con qué frecuencia realmente desea descargar la biblioteca antes de la finalización de la aplicación? El riesgo es mayor que el valor). – CashCow

6

Si son la misma DLL, no volverá a cargarla.

http://msdn.microsoft.com/en-us/library/ms684175(VS.85).aspx

"Si el módulo especificado es un archivo DLL que no está ya cargado para el proceso de llamada, el sistema llama a la función DllMain del DLL con el valor DLL_PROCESS_ATTACH. Si DllMain devuelve TRUE, LoadLibrary devuelve un identificador para el Si DllMain devuelve FALSE, el sistema descarga la DLL del espacio de direcciones del proceso y LoadLibrary devuelve NULL. No es seguro llamar a LoadLibrary desde DllMain. Para obtener más información, consulte la sección Comentarios en DllMain.

"Si lpFileName no incluye una ruta y hay más de un módulo cargado con el mismo nombre base y extensión, la función devuelve un identificador al módulo que se cargó primero."

3

No, no es así. Para evitar esto, puede copiar el .dll en un archivo temporal (tantas veces como necesite para cargar el .dll) y luego eliminar los archivos una vez que haya terminado.

Cuestiones relacionadas