2011-01-25 12 views
7

¿Cuándo se debe vincular de forma implícita o explícita a una DLL y cuáles son las prácticas o las dificultades más comunes?Vinculación implícita con explícita a una DLL

+1

¿qué quieres decir con explícito vs implícito? ¿Quiere decir usar LoadLibrary o enlaces estáticos? – tenfour

+1

@tenfour implícito es cuando usa un .h y necesita vincularlo contra .lib y explícito cuando usa LoadLibrary y GetProcAddress respectivamente. La vinculación estática es otro chicle. – Shinnok

+1

A veces utilizas explícitamente cuando no tienes un archivo .lib a mano. –

Respuesta

8

Es bastante raro vincular explícitamente una DLL. Principalmente porque es doloroso y propenso a errores. Debe escribir una declaración de puntero a función para la función exportada y obtener el código LoadLibrary + GetProcAddress + FreeLibrary correcto. Solo lo haría si necesita una dependencia de tiempo de ejecución en una DLL de estilo de complemento o si desea seleccionar entre un conjunto de archivos DLL basados ​​en la configuración. O para tratar con versiones, una función API que solo está disponible en versiones posteriores de Windows, por ejemplo. La vinculación explícita es la predeterminada para las DLL COM y .NET.

Más información general en este MSDN Library article.

4

Supongo que se refiere a la vinculación usando un .lib frente a cargar un archivo DLL dinámicamente usando LoadLibrary().

Cargando una DLL estáticamente conectando con su .lib es generalmente más seguro. La etapa de enlace comprueba que todos los puntos de entrada existen en tiempo de compilación y no hay posibilidad de que cargue una DLL que no tenga la función que está esperando. También es más fácil no tener que usar GetProcAddress().

Por lo general, debe utilizar la carga dinámica solo cuando sea absolutamente necesario.

5

Estoy de acuerdo con otros que ya le respondieron (Hans Passant y shoosh). Quiero añadir sólo dos cosas:

1) Un escenario común cuando se tiene que utilizar LoadLibrary y GetProcAddress es la siguiente: usted quiere usar alguna nueva API existente en las nuevas versiones de Windows solamente, pero la API no son críticas en su solicitud. Entonces prueba con LoadLibrary y GetProcAddress si la función que necesita existe, y la usa en el caso. Lo que hace su programa si las funciones no existen depende totalmente de su implementación.

2) Hay una opción importante que no incluyó en su pregunta: delayed loading of DLLs. En este caso, el sistema operativo cargará la DLL cuando se llame a una de sus funciones y no al inicio de la aplicación. Permite utilizar bibliotecas de importación (archivos .lib) en algunos escenarios en los que se debe utilizar el enlace explícito a primera vista. Además, mejora el tiempo de inicio de las aplicaciones y Windows lo usa ampliamente. Entonces el camino también es recomendado.

+0

La carga del retraso la implementa el vinculador de Visual Studio, no el sistema operativo. Inserta las llamadas apropiadas 'LoadLibrary' y 'GetProcAddress' por usted. El sistema operativo no sabe quién realizó estas llamadas. Es por eso que funciona de nuevo a Windows 95, aunque la función se introdujo en 98. – MSalters

+0

@MSalters: Estás equivocado. La carga de retardo utilizada Ejecutable de programa (PE) tiene una sección 'IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT' adicional. – Oleg

Cuestiones relacionadas