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
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.
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."
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.
- 1. Gedit en Windows crea varias instancias
- 2. LoadLibrary código() Error 127
- 3. LoadLibrary Referencia Contando
- 4. Cuando Spring crea instancias de objetos que se inyectan
- 5. LINQ distintas()
- 6. Guía para configurar Apache2 con varias instancias distintas de Tomcat 7
- 7. Seleccionar algunas etiquetas distintas y algunas no distintas en SPARQL
- 8. distintas() no funciona
- 9. Distintas alturas UITableViewCell?
- 10. Django: claves externas distintas
- 11. Seleccionando combinaciones Distintas.
- 12. Seleccionar filas distintas de MongoDB
- 13. distintas en el marco Entidad
- 14. Supresión de filas no distintas
- 15. Linq a entidades: Uniones + Distintas
- 16. Highcharts: animaciones distintas del predeterminado
- 17. consulta SQL, filas distintas necesaria
- 18. ¿Cómo crea db4o objetos?
- 19. ¿Para qué Sun JVM crea instancias de sun.reflect.DelegatingClassLoader en tiempo de ejecución?
- 20. Android: ¿Es posible tener múltiples preferencias compartidas distintas por aplicación?
- 21. ¿Las funciones LoadLibrary, FreeLibrary y GetModuleHandle Win32 son seguras?
- 22. LoadLibrary falla con el código de error 14001
- 23. ¿Qué podría evitar que una DLL se cargue con LoadLibrary?
- 24. ¿LoadLibrary analiza las variables de entorno como% windir%
- 25. LoadLibrary project.dll falló. El módulo especificado no se pudo encontrar
- 26. LINQ to SQL distintas y orderBy
- 27. consulta LINQ con distintas y Unión
- 28. Seleccionar filas distintas de datatable en Linq
- 29. Seleccionar combinaciones distintas de dos columnas
- 30. suma MYSQL() para las filas distintas
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
Buena captura. Gracias, Michael. –
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