vinculación dinámica de Run-Time
Cuando la aplicación llama a las funciones LoadLibrary o LoadLibraryEx , el sistema intenta localizar el archivo DLL (para obtener más información, consulte Dynamic-Link Library Search Order). Si la búsqueda se realiza correctamente, el sistema asigna el módulo DLL al espacio de direcciones virtuales del proceso e incrementa el recuento de referencias. Si la llamada a LoadLibrary o LoadLibraryEx especifica un archivo DLL cuyo código ya está asignado al espacio de direcciones virtuales del proceso de llamada, la función simplemente devuelve un identificador al archivo DLL e incrementa el recuento de referencias de DLL. Tenga en cuenta que dos archivos DLL que tienen el mismo nombre de archivo base y la misma extensión, pero que se encuentran en directorios diferentes no se consideran el mismo archivo DLL.
El sistema llama a la función de punto de entrada en el contexto del subproceso que llamó a LoadLibrary o LoadLibraryEx. No se llama a la función de punto de entrada si el proceso ya cargó el archivo DLL a través de una llamada a LoadLibrary o LoadLibraryEx sin ninguna llamada correspondiente a la función FreeLibrary .
Si el sistema no encuentra el archivo DLL o si la función de punto de entrada devuelve FALSE, LoadLibrary o LoadLibraryEx devuelve NULL. Si LoadLibrary o LoadLibraryEx se realiza correctamente, devuelve un identificador al módulo DLL. El proceso puede usar este identificador para identificar el archivo DLL en una llamada a la función GetProcAddress, FreeLibrary o FreeLibraryAndExitThread .
La función GetModuleHandle devuelve un identificador usado en GetProcAddress, FreeLibrary o FreeLibraryAndExitThread. La función GetModuleHandle solo se realiza correctamente si el módulo DLL ya está asignado al espacio de direcciones del proceso mediante la vinculación en tiempo de carga o mediante una llamada anterior a LoadLibrary o LoadLibraryEx. A diferencia de LoadLibrary o LoadLibraryEx, GetModuleHandle no incrementa el recuento de referencias del módulo. La función GetModuleFileName recupera la ruta de acceso completa del módulo asociado a un identificador devuelto por GetModuleHandle, LoadLibrary o LoadLibraryEx.
El proceso puede usar GetProcAddress para obtener la dirección de una función exportada en el archivo DLL mediante un identificador de módulo DLL devuelto por LoadLibrary o LoadLibraryEx, GetModuleHandle.
Cuando el módulo DLL ya no es necesario, el proceso puede llamar a FreeLibrary o FreeLibraryAndExitThread. Estas funciones reducen el recuento de referencias del módulo y desasignación del código DLL del espacio de direcciones virtuales del proceso si el recuento de referencias es cero.
La vinculación dinámica en tiempo de ejecución permite que el proceso continúe ejecutándose aunque un archivo DLL no esté disponible. A continuación, el proceso puede usar un método alternativo para lograr su objetivo. Por ejemplo, si un proceso no puede encontrar un archivo DLL, puede intentar usar otro, o puede notificar al usuario un error. Si el usuario puede proporcionar la ruta de acceso completa del archivo DLL que falta, el proceso puede usar esta información para cargar el archivo DLL aunque no esté en la ruta de acceso de búsqueda normal. Esta situación contrasta con la vinculación en tiempo de carga, en la que el sistema simplemente finaliza el proceso si no encuentra el archivo DLL.
La vinculación dinámica en tiempo de ejecución puede causar problemas si el archivo DLL usa la función DllMain para realizar la inicialización de cada subproceso de un proceso, ya que no se llama al punto de entrada para los subprocesos que existían antes de llamar a LoadLibrary o LoadLibraryEx . Para obtener un ejemplo en el que se muestra cómo tratar este problema, consulte Uso del almacenamiento local de subprocesos en una biblioteca de Dynamic-Link.
Temas relacionados