Función LoadLibraryExA (libloaderapi.h)
Carga el módulo especificado en el espacio de direcciones del proceso de llamada. El módulo especificado puede hacer que se carguen otros módulos.
Sintaxis
HMODULE LoadLibraryExA(
[in] LPCSTR lpLibFileName,
HANDLE hFile,
[in] DWORD dwFlags
);
Parámetros
[in] lpLibFileName
Cadena que especifica el nombre de archivo del módulo que se va a cargar. Este nombre no está relacionado con el nombre almacenado en un módulo de biblioteca, tal como se especifica en la palabra clave LIBRARY
El módulo puede ser un módulo de biblioteca (un archivo .dll) o un módulo ejecutable (un archivo .exe). Si el módulo especificado es un módulo ejecutable, no se cargan las importaciones estáticas; en su lugar, el módulo se carga como si se especificara DONT_RESOLVE_DLL_REFERENCES. Consulte el parámetro dwFlags para obtener más información.
Si la cadena especifica un nombre de módulo sin una ruta de acceso y se omite la extensión de nombre de archivo, la función anexa la extensión de biblioteca predeterminada ".DLL" al nombre del módulo. Para evitar que la función anexe ".DLL" al nombre del módulo, incluya un carácter de punto final (.) en la cadena de nombre del módulo.
Si la cadena especifica una ruta de acceso completa, la función solo busca esa ruta de acceso para el módulo. Al especificar una ruta de acceso, asegúrese de usar barras diagonales inversas (\), no barras diagonales (/). Para obtener más información sobre las rutas de acceso, vea archivos de nomenclatura, rutas de acceso y espacios de nombres.
Si la cadena especifica un nombre de módulo sin una ruta de acceso y más de un módulo cargado tiene el mismo nombre base y extensión, la función devuelve un identificador al módulo que se cargó primero.
Si la cadena especifica un nombre de módulo sin una ruta de acceso y un módulo del mismo nombre aún no se ha cargado, o si la cadena especifica un nombre de módulo con una ruta de acceso relativa, la función busca el módulo especificado. La función también busca módulos si la carga del módulo especificado hace que el sistema cargue otros módulos asociados (es decir, si el módulo tiene dependencias). Los directorios que se buscan y el orden en el que se buscan dependen de la ruta de acceso especificada y del parámetro dwFlags. Para obtener más información, vea Comentarios.
Si la función no encuentra el módulo o una de sus dependencias, se produce un error en la función.
hFile
Este parámetro está reservado para uso futuro. Debe ser NULL.
[in] dwFlags
Acción que se realizará al cargar el módulo. Si no se especifican marcas, el comportamiento de esta función es idéntico al de la función loadLibrary de
Valor | Significado |
---|---|
|
Si se usa este valor y el módulo ejecutable es un archivo DLL, el sistema no llama a DllMain para la inicialización y finalización del proceso y el subproceso. Además, el sistema no carga módulos ejecutables adicionales a los que hace referencia el módulo especificado.
Nota No usar este valor; solo se proporciona para la compatibilidad con versiones anteriores. Si planea acceder solo a datos o recursos en el archivo DLL, use LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE o LOAD_LIBRARY_AS_IMAGE_RESOURCE o ambos. De lo contrario, cargue la biblioteca como un módulo DLL o ejecutable mediante la función LoadLibrary.
|
|
Si se usa este valor, el sistema no comprueba reglas de appLocker ni aplica directivas de restricción de software para el archivo DLL. Esta acción solo se aplica a la DLL que se carga y no a sus dependencias. Este valor se recomienda para su uso en programas de instalación que deben ejecutar archivos DLL extraídos durante la instalación.
Windows Server 2008 R2 y Windows 7: En sistemas con KB2532445 instalados, el autor de la llamada debe ejecutarse como "LocalSystem" o "TrustedInstaller"; de lo contrario, el sistema omite esta marca. Para obtener más información, vea "Puedes eludir las reglas de AppLocker mediante una macro de Office en un equipo que ejecuta Windows 7 o Windows Server 2008 R2" en la Ayuda y soporte técnico de Knowledge Base en https://support.microsoft.com/kb/2532445. Windows Server 2008, Windows Vista, Windows Server 2003 y Windows XP: AppLocker se introdujo en Windows 7 y Windows Server 2008 R2. |
|
Si se usa este valor, el sistema asigna el archivo al espacio de direcciones virtuales del proceso de llamada como si fuera un archivo de datos. No se hace nada para ejecutar o preparar para ejecutar el archivo asignado. Por lo tanto, no puede llamar a funciones como GetModuleFileName, getModuleHandle o GetProcAddress con este archivo DLL. El uso de este valor hace que las escrituras en memoria de solo lectura generen una infracción de acceso. Use esta marca cuando quiera cargar un archivo DLL solo para extraer mensajes o recursos de él.
Este valor se puede usar con LOAD_LIBRARY_AS_IMAGE_RESOURCE. Para obtener más información, vea Comentarios. |
|
De forma similar a LOAD_LIBRARY_AS_DATAFILE, excepto que el archivo DLL se abre con acceso de escritura exclusivo para el proceso de llamada. Otros procesos no pueden abrir el archivo DLL para el acceso de escritura mientras está en uso. Sin embargo, otros procesos pueden abrir el archivo DLL.
Este valor se puede usar con LOAD_LIBRARY_AS_IMAGE_RESOURCE. Para obtener más información, vea Comentarios. Windows Server 2003 y Windows XP: Este valor no se admite hasta Windows Vista. |
|
Si se usa este valor, el sistema asigna el archivo al espacio de direcciones virtuales del proceso como un archivo de imagen.
Sin embargo, el cargador no carga las importaciones estáticas ni realiza los otros pasos de inicialización habituales. Use esta marca cuando quiera cargar un archivo DLL solo para extraer mensajes o recursos de él.
A menos que la aplicación dependa del archivo que tenga el diseño en memoria de una imagen, este valor debe usarse con LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE o LOAD_LIBRARY_AS_DATAFILE. Para obtener más información, vea la sección Comentarios. Windows Server 2003 y Windows XP: Este valor no se admite hasta Windows Vista. |
|
Si se usa este valor, se busca en el directorio de instalación de la aplicación el archivo DLL y sus dependencias. No se buscan directorios en la ruta de búsqueda estándar. Este valor no se puede combinar con LOAD_WITH_ALTERED_SEARCH_PATH.
Windows 7, Windows Server 2008 R2, Windows Vista y Windows Server 2008: Este valor requiere que se instale KB2533623. Windows Server 2003 y Windows XP: Este valor no se admite. |
|
Este valor es una combinación de LOAD_LIBRARY_SEARCH_APPLICATION_DIR, LOAD_LIBRARY_SEARCH_SYSTEM32y LOAD_LIBRARY_SEARCH_USER_DIRS. No se buscan directorios en la ruta de búsqueda estándar. Este valor no se puede combinar con LOAD_WITH_ALTERED_SEARCH_PATH.
Este valor representa el número máximo recomendado de directorios que una aplicación debe incluir en su ruta de búsqueda dll. Windows 7, Windows Server 2008 R2, Windows Vista y Windows Server 2008: Este valor requiere que se instale KB2533623. Windows Server 2003 y Windows XP: Este valor no se admite. |
|
Si se usa este valor, el directorio que contiene el archivo DLL se agrega temporalmente al principio de la lista de directorios que se buscan en las dependencias del archivo DLL. No se buscan directorios en la ruta de búsqueda estándar.
El parámetro lpFileName debe especificar una ruta de acceso completa. Este valor no se puede combinar con LOAD_WITH_ALTERED_SEARCH_PATH. Por ejemplo, si Lib2.dll es una dependencia de C:\Dir1\Lib1.dll, loading Lib1.dll with this value causes the system to search for Lib2.dll solo en C:\Dir1. Para buscar Lib2.dll en C:\Dir1 y todos los directorios de la ruta de búsqueda dll, combine este valor con LOAD_LIBRARY_SEARCH_DEFAULT_DIRS. Windows 7, Windows Server 2008 R2, Windows Vista y Windows Server 2008: Este valor requiere que se instale KB2533623. Windows Server 2003 y Windows XP: Este valor no se admite. |
|
Si se usa este valor, %windows%\system32 se busca el archivo DLL y sus dependencias.
No se buscan directorios en la ruta de búsqueda estándar. Este valor no se puede combinar con LOAD_WITH_ALTERED_SEARCH_PATH.
Windows 7, Windows Server 2008 R2, Windows Vista y Windows Server 2008: Este valor requiere que se instale KB2533623. Windows Server 2003 y Windows XP: Este valor no se admite. |
|
Si se usa este valor, los directorios agregados mediante el AddDllDirectory o la función SetDllDirectory se buscan el archivo DLL y sus dependencias. Si se ha agregado más de un directorio, no se especifica el orden en que se buscan los directorios. No se buscan directorios en la ruta de búsqueda estándar. Este valor no se puede combinar con LOAD_WITH_ALTERED_SEARCH_PATH.
Windows 7, Windows Server 2008 R2, Windows Vista y Windows Server 2008: Este valor requiere que se instale KB2533623. Windows Server 2003 y Windows XP: Este valor no se admite. |
|
Si se usa este valor y lpFileName especifica una ruta de acceso absoluta, el sistema usa la estrategia alternativa de búsqueda de archivos que se describe en la sección Comentarios para buscar módulos ejecutables asociados que el módulo especificado hace que se cargue. Si se usa este valor y lpFileName especifica una ruta de acceso relativa, el comportamiento no está definido.
Si no se usa este valor o si lpFileName no especifica una ruta de acceso, el sistema usa la estrategia de búsqueda estándar que se describe en la sección Comentarios para buscar módulos ejecutables asociados que el módulo especificado hace que se cargue. Este valor no se puede combinar con ninguna marca de LOAD_LIBRARY_SEARCH. |
|
Especifica que la firma digital de la imagen binaria debe comprobarse en tiempo de carga.
Este valor requiere Windows 8.1, Windows 10 o posterior. |
|
Si se usa este valor, la carga de un archivo DLL para su ejecución desde el directorio actual solo se permite si se encuentra en un directorio de la lista de carga segura. |
Valor devuelto
Si la función se ejecuta correctamente, el valor devuelto es un identificador para el módulo cargado.
Si se produce un error en la función, el valor devuelto es NULL. Para obtener información de error extendida, llame a GetLastError.
Observaciones
La función LoadLibraryEx es muy similar a la función LoadLibrary. Las diferencias constan de un conjunto de comportamientos opcionales que loadLibraryEx proporciona:
LoadLibraryEx puede cargar un módulo DLL sin llamar a la función dllmaindel archivo DLL. - LoadLibraryEx puede cargar un módulo de una manera optimizada para el caso en el que nunca se ejecutará el módulo, cargando el módulo como si fuera un archivo de datos.
- LoadLibraryEx puede encontrar módulos y sus módulos asociados mediante cualquiera de las dos estrategias de búsqueda o puede buscar en un conjunto específico del proceso de directorios.
El proceso de llamada puede usar el identificador devuelto por
Para habilitar o deshabilitar los mensajes de error mostrados por el cargador durante las cargas dll, use la función SetErrorMode.
No es seguro llamar a LoadLibraryEx desde DllMain. Para obtener más información, vea la sección Comentarios de DllMain.
Visual C++: El compilador de Visual C++ admite una sintaxis que permite declarar variables locales de subprocesos: _declspec(thread). Si usa esta sintaxis en un archivo DLL, no podrá cargar el archivo DLL explícitamente mediante LoadLibraryEx en versiones de Windows anteriores a Windows Vista. Si el archivo DLL se cargará explícitamente, debe usar las funciones de almacenamiento local del subproceso en lugar de _declspec(thread). Para obtener un ejemplo, vea Uso del almacenamiento local de subprocesos en una biblioteca de vínculos dinámicos.
carga de un archivo DLL como un archivo de datos o un recurso de imagen
Los valores de LOAD_LIBRARY_AS_DATAFILE, LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVEy LOAD_LIBRARY_AS_IMAGE_RESOURCE afectan al recuento de referencias por proceso y a la carga del módulo especificado. Si se especifica alguno de estos valores para el parámetro dwFlags, el cargador comprueba si el proceso ya lo cargó el módulo como un archivo DLL ejecutable. Si es así, esto significa que el módulo ya está asignado al espacio de direcciones virtuales del proceso de llamada. En este caso, LoadLibraryEx devuelve un identificador al archivo DLL e incrementa el recuento de referencias de DLL. Si el módulo DLL aún no se cargó como DLL, el sistema asigna el módulo como un archivo de datos o imagen y no como un archivo DLL ejecutable. En este caso, LoadLibraryEx devuelve un identificador al archivo de imagen o datos cargados, pero no incrementa el recuento de referencias del módulo y no hace que el módulo sea visible para funciones como CreateToolhelp32Snapshot o EnumProcessModules.Si se llama
Cuando se usa el valor de LOAD_LIBRARY_AS_IMAGE_RESOURCE, el módulo se carga como una imagen mediante la expansión de alineación de la sección ejecutable portátil (PE). No es necesario asignar direcciones virtuales relativas (RVA) a direcciones de disco, por lo que los recursos se pueden recuperar más rápidamente del módulo. Especificar LOAD_LIBRARY_AS_IMAGE_RESOURCE impide que otros procesos modifiquen el módulo mientras se cargan.
A menos que una aplicación dependa de características específicas de asignación de imágenes, se debe usar el valor de LOAD_LIBRARY_AS_IMAGE_RESOURCE con LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE o LOAD_LIBRARY_AS_DATAFILE. Esto permite al cargador elegir si se carga el módulo como un recurso de imagen o un archivo de datos, seleccionando la opción que permita al sistema compartir páginas de forma más eficaz. Las funciones de recursos como FindResource pueden usar cualquiera de las asignaciones.
Para determinar cómo se cargó un módulo, use una de las siguientes macros para probar el identificador devuelto por LoadLibraryEx.
#define LDR_IS_DATAFILE(handle) (((ULONG_PTR)(handle)) & (ULONG_PTR)1)
#define LDR_IS_IMAGEMAPPING(handle) (((ULONG_PTR)(handle)) & (ULONG_PTR)2)
#define LDR_IS_RESOURCE(handle) (LDR_IS_IMAGEMAPPING(handle) || LDR_IS_DATAFILE(handle))
En la tabla siguiente se describen estas macros.
Macro | Descripción |
---|---|
LDR_IS_DATAFILE(identificador) | Si esta macro devuelve TRUE, el módulo se cargó como un archivo de datos (LOAD_LIBRARY_AS_DATAFILE o LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE). |
LDR_IS_IMAGEMAPPING(identificador) | Si esta macro devuelve TRUE, el módulo se cargó como un archivo de imagen (LOAD_LIBRARY_AS_IMAGE_RESOURCE). |
LDR_IS_RESOURCE( identificador de) | Si esta macro devuelve TRUE, el módulo se cargó como un archivo de datos o un archivo de imagen. |
Use la función
búsqueda de archivos DLL y dependencias
La ruta de acceso de búsqueda es el conjunto de directorios que se buscan en un archivo DLL. La funciónLa función LoadLibraryEx usa la ruta de acceso de búsqueda estándar en los casos siguientes:
- El nombre de archivo se especifica sin una ruta de acceso y el nombre del archivo base no coincide con el nombre de archivo base de un módulo cargado y no se usa ninguna de las marcas de LOAD_LIBRARY_SEARCH.
- Se especifica una ruta de acceso, pero no se usa LOAD_WITH_ALTERED_SEARCH_PATH.
- La aplicación no ha especificado una ruta de búsqueda de DLL predeterminada para el proceso mediante SetDefaultDllDirectories.
Si lpFileName especifica una ruta de acceso relativa, toda la ruta de acceso relativa se anexa a cada token de la ruta de búsqueda dll. Para cargar un módulo desde una ruta de acceso relativa sin buscar en ninguna otra ruta de acceso, use GetFullPathName para obtener una ruta de acceso no rerelative y llamar a LoadLibraryEx con la ruta de acceso no rerelative. Si el módulo se está cargando como un archivo de datos y la ruta de acceso relativa comienza con "." o "..", la ruta de acceso relativa se trata como una ruta de acceso absoluta.
Si lpFileName especifica una ruta de acceso absoluta y dwFlags se establece en LOAD_WITH_ALTERED_SEARCH_PATH, LoadLibraryEx usa la ruta de acceso de búsqueda modificada. El comportamiento no está definido cuando se establece LOAD_WITH_ALTERED_SEARCH_PATH marca y lpFileName especifica una ruta de acceso relativa.
La función SetDllDirectory se puede usar para modificar la ruta de acceso de búsqueda. Esta solución es mejor que usar SetCurrentDirectory o codificar de forma rígida la ruta de acceso completa al archivo DLL. Sin embargo, tenga en cuenta que el uso de SetDllDirectory deshabilita eficazmente el modo de búsqueda dll seguro mientras el directorio especificado está en la ruta de búsqueda y no es seguro para subprocesos. Si es posible, es mejor usar AddDllDirectory para modificar una ruta de búsqueda de proceso predeterminada. Para obtener más información, consulte Dynamic-Linkde orden de búsqueda de biblioteca.
Una aplicación puede especificar los directorios para buscar una sola llamada LoadLibraryEx mediante las marcas LOAD_LIBRARY_SEARCH_*. Si se especifica más de una marca de LOAD_LIBRARY_SEARCH, los directorios se buscan en el orden siguiente:
- Directorio que contiene el archivo DLL (LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR). Este directorio solo se busca en las dependencias del archivo DLL que se van a cargar.
- Directorio de la aplicación (LOAD_LIBRARY_SEARCH_APPLICATION_DIR).
- Las rutas de acceso agregadas explícitamente a la ruta de búsqueda de la aplicación con la función addDllDirectory de
( LOAD_LIBRARY_SEARCH_USER_DIRS ) o la función SetDllDirectory. Si se ha agregado más de una ruta de acceso, no se especifica el orden en que se buscan las rutas de acceso. - Directorio System32 (LOAD_LIBRARY_SEARCH_SYSTEM32).
Windows 7, Windows Server 2008 R2, Windows Vista y Windows Server 2008: Las marcas LOAD_LIBRARY_SEARCH_ están disponibles en los sistemas que tienen instalado KB2533623. Para determinar si las marcas están disponibles, use GetProcAddress para obtener la dirección de la función AddDllDirectory, RemoveDllDirectoryo SetDefaultDllDirectories. Si getProcAddress se realiza correctamente, las marcas de LOAD_LIBRARY_SEARCH_ se pueden usar con LoadLibraryEx.
Si la aplicación ha usado la función SetDefaultDllDirectories para establecer una ruta de búsqueda DLL para el proceso y ninguna de las marcas de LOAD_LIBRARY_SEARCH_* se usan, la función LoadLibraryEx usa la ruta de búsqueda dll del proceso en lugar de la ruta de búsqueda estándar.
Si se especifica una ruta de acceso y hay un archivo de redireccionamiento asociado a la aplicación, la función LoadLibraryEx busca el módulo en el directorio de la aplicación. Si el módulo existe en el directorio de la aplicación, LoadLibraryEx omite la especificación de ruta de acceso y carga el módulo desde el directorio de la aplicación. Si el módulo no existe en el directorio de la aplicación, la función carga el módulo desde el directorio especificado. Para obtener más información, consulte redirección de la biblioteca de vínculos dinámicos.
Si llama a LoadLibraryEx con el nombre de un ensamblado sin una especificación de ruta de acceso y el ensamblado aparece en el manifiesto compatible con el sistema, la llamada se redirige automáticamente al ensamblado en paralelo.
Comentarios de seguridad de
LOAD_LIBRARY_AS_DATAFILE no impide que otros procesos modifiquen el módulo mientras se carga. Dado que esto puede hacer que la aplicación sea menos segura, debe usar LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE en lugar de LOAD_LIBRARY_AS_DATAFILE al cargar un módulo como un archivo de datos, a menos que necesite usar específicamente LOAD_LIBRARY_AS_DATAFILE. Especificar LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE impide que otros procesos modifiquen el módulo mientras se carga. No especifique LOAD_LIBRARY_AS_DATAFILE ni LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE en la misma llamada.No use la función
No realice suposiciones sobre la versión del sistema operativo basada en una LoadLibraryEx llamada que busque un archivo DLL. Si la aplicación se ejecuta en un entorno en el que el archivo DLL no está presente legítimamente, pero una versión malintencionada del archivo DLL se encuentra en la ruta de búsqueda, se puede cargar la versión malintencionada del archivo DLL. En su lugar, use las técnicas recomendadas descritas en Obtener la versión del sistema.
Para obtener una explicación general de los problemas de seguridad de dll, consulte Dynamic-Link Seguridad de la biblioteca.
Ejemplos
En el ejemplo de código siguiente se muestra una llamada a LoadLibraryExA.
//Load the FMAPI DLL
hLib = ::LoadLibraryEx(L"fmapi.dll", NULL, NULL);
if ( !hLib )
{
wprintf(L"Could not load fmapi.dll, Error #%d.\n", GetLastError());
return;
}
Para obtener un ejemplo adicional, vea Buscar texto para ver los números de código de error.
Nota
El encabezado libloaderapi.h define LoadLibraryEx como alias que selecciona automáticamente la versión ANSI o Unicode de esta función en función de la definición de la constante de preprocesador UNICODE. La combinación del uso del alias neutral de codificación con código que no es neutral de codificación puede dar lugar a errores de coincidencia que dan lugar a errores de compilación o tiempo de ejecución. Para obtener más información, vea Conventions for Function Prototypes.
Requisitos
Requisito | Valor |
---|---|
cliente mínimo admitido | Windows XP [solo aplicaciones de escritorio] |
servidor mínimo admitido | Windows Server 2003 [solo aplicaciones de escritorio] |
de la plataforma de destino de |
Windows |
encabezado de |
libloaderapi.h (incluya Windows.h) |
biblioteca de |
Kernel32.lib |
DLL de |
Kernel32.dll |
Consulte también
funciones de biblioteca de
de orden de búsqueda de la biblioteca de
de seguridad de la biblioteca de
Run-Time de vinculación dinámica