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-Linkde orden de búsqueda de biblioteca). 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 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 de GetProcAddress, FreeLibraryo FreeLibraryAndExitThread.
La función getModuleHandle devuelve un identificador usado en GetProcAddress, FreeLibraryo 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ónGetModuleFileNamerecupera la ruta de acceso completa del módulo asociado a un identificador devuelto por GetModuleHandle, LoadLibraryo 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 anulan el mapa 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 incluso si 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 localizar un archivo DLL, puede intentar usar otro o puede notificar al usuario un error. Si el usuario puede proporcionar la ruta de acceso completa de la DLL que falta, el proceso puede usar esta información para cargar el archivo DLL aunque no esté en la ruta 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 dllMainpara 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 se llama a LoadLibrary o LoadLibraryEx. Para obtener un ejemplo que muestra cómo tratar este problema, consulte Uso del almacenamiento local de subprocesos en una biblioteca de Dynamic-Link.
Temas relacionados