Cómo cargar dinámicamente bibliotecas de vínculos dinámicos (DLL) en Windows NT

Seleccione idioma Seleccione idioma
Id. de artículo: 100635 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

Resumen

Cuando utiliza la función LoadLibrary() en Windows de 16 bits o en OS/2, el sistema operativo carga el especificado Dynamic-Link Library (DLL) sólo una vez. Por lo tanto, el archivo DLL tiene el misma dirección en cada proceso. Sin embargo, funciona la carga dinámica de archivos DLL forma diferente en Windows NT.

El sistema operativo se carga un archivo DLL por separado para cada uno procesar porque cada aplicación tiene su propio espacio de direcciones en Windows NT; el espacio de direcciones se comparte en Windows de 16 bits y en OS/2. Dado que el sistema operativo debe asignar páginas en el espacio de direcciones para cada uno proceso, el archivo DLL se puede cargar en diferentes direcciones en procesos diferentes. El Administrador de memoria optimiza la DLL de carga tal que si dos procesos comparten el páginas del mismo desde la misma imagen DLL, comparten la misma memoria física.

Cada archivo DLL tiene una dirección base preferida, especificada en el momento de la vinculación. If el intervalo de espacio de direcciones de la dirección base preferida a la dirección base Además del tamaño de la imagen no está disponible, a continuación, el sistema operativo carga el archivo DLL en otro lugar en la memoria y se aplica a las reparaciones en sus direcciones. No hay ninguna método para especificar la dirección de carga en tiempo de carga.

Para resumir, el sistema realiza los pasos siguientes en tiempo de carga:
  1. Examina la imagen y determina su base preferida dirección y el tamaño necesario.
  2. Busca el espacio de direcciones requerido y la imagen, se asigna Copy-on-write, desde el archivo.
  3. Se aplica a las reparaciones internas si la imagen no se encuentra en su dirección base preferida.
  4. Correcciones de seguridad de todas las importaciones de vínculos dinámicos mediante la colocación de la correcta dirección para cada función importada en la entrada correspondiente de la importación Tabla de direcciones. Esta tabla almacena direcciones de 32 bits de forma contigua; para almacenar hasta funciones importadas 1024 requiere que éste sucio sólo una página de memoria.

Más información

Las páginas que contienen código que se comparten, mediante un esquema de protección de Copy-on-write. Copy-on-write significa que una página es de sólo lectura; Sin embargo, si un proceso escribe en la infracción de acceso y la página no se produce. En su lugar, el Administrador de memoria hace una copia privada de la página de la aplicación de uso y permite la escritura continuar. Por ejemplo, si dos procesos que se inician desde el mismo.Archivo EXE, cada proceso tiene inicialmente todas las páginas asignado desde el.EXE file copy-on-write. Como los dos procesos que se empiece a modificar páginas, cada uno recibe una copia privada de las páginas modificadas. La memoria el administrador es gratuito para optimizar las páginas sin modificar y asignar la misma física memoria en el espacio de direcciones de ambos procesos. Páginas modificadas se intercambian a y el archivo de la página en lugar de la.Archivo EXE.

Dos tipos de reparaciones están disponibles. La primera se utiliza para la dirección de una función importada. Según la especificación de archivo ejecutable Portable, este tipo de corrección es almacenados en Import Address Table (IAT), una matriz de punteros a función de 32 bits, uno para cada función importada. La tabla IAT tiene su propia página o páginas, porque es siempre se modifica. Una llamada a una función importada es realmente una llamada indirecta a través de la entrada correspondiente en la tabla IAT. Cuando se carga una imagen en su dirección base preferida, las reparaciones de la función importada son las reparaciones sólo requeridas.

Nota que una optimización está disponible mediante el cual cada una biblioteca de importación un número de 32 bits que se corresponde con cada función además de cualquiera de las exportaciones nombre o número ordinal. Esto sirve como una "indicación" a la velocidad realizan las correcciones en tiempo de carga. Si no lo hacen las sugerencias en la aplicación y en la DLL cargada coincidencia, el cargador efectúa una búsqueda binaria que se basa en el nombre de función.

El otro tipo de corrección es necesario para las referencias a código o datos en la imagen cuando se carga la imagen en otra que en su base preferida dirección. Cuando el Administrador de memoria, quita una página de la memoria, se comprueba de la página se ha modificado. En caso contrario, la página conserva su copy-on-write asignación y pueden descartarse de la memoria. De lo contrario, deben escribirse en el archivo de paginación para que la página modificada se puede recuperar desde el archivo de paginación en su lugar que desde el archivo de imagen ejecutable.

Incluso si una aplicación llama a LoadLibrary() más de una vez para un archivo DLL, el punto de entrada DLL, DllMain(), se llama sólo una vez y es de sólo una entrada DLL_PROCESS_ATTACH creado. De forma similar, si la aplicación llama a más de una vez FreeLibrary() , DLL_PROCESS_DETACH sólo se produce para la llamada en que el contador de referencias de archivo DLL se vuelve a cero.

Datos de instancia global para el archivo DLL se almacena en una base por proceso (sólo un conjunto de datos por proceso). Si es necesario almacenar los datos de instancia global para cada llamada de LoadLibrary() realizada en un único proceso, considere el uso local de subprocesos almacenamiento de información (TLS) como una alternativa. Si utiliza varios subprocesos de ejecución, TLS proporciona almacenamiento de datos únicos para cada valor ThreadID. Este proceso requiere muy poca sobrecarga para el archivo DLL; sólo debe crear un índice TLS global en el proceso de inicialización. En la inicialización de subproceso, utilice GlobalAlloc(), HeapAlloc(), LocalAlloc(), funciones en la biblioteca de tiempo de ejecución de C, o en otro método para asignar un bloque de memoria y llamar a la función TlsSetValue() para almacenar un puntero a la memoria mediante TLS global valor de índice. Win32 internamente almacena el puntero de cada subproceso indizada por el índice TLS y ThreadID para proporcionar almacenamiento de información específica de subprocesos.

Propiedades

Id. de artículo: 100635 - Última revisión: domingo, 10 de marzo de 2013 - Versión: 7.0
La información de este artículo se refiere a:
  • Microsoft Visual C++ 2.0 Professional Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional
  • Microsoft Visual C++ .NET 2002 Standard
  • Microsoft Visual C++ .NET 2003 Standard
  • Microsoft Visual C++ 2005 Express Edition
Palabras clave: 
kbdll kbhowto kbinfo kblangc kbmt KB100635 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 100635

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com