PRB: Llamar a LoadLibrary() para cargar una DLL que tiene TLS estático

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

Síntomas

Una biblioteca de vínculos dinámicos (DLL), utiliza __declspec(thread) para asignar el almacenamiento local de subproceso estático (TLS). No hay problemas asociados a la ejecución de una aplicación que está vinculada con la biblioteca estática correspondiente. Sin embargo, cuando una aplicación utiliza la función LoadLibrary para cargar el archivo DLL en lugar de utilizar la versión estática, LoadLibrary falla en Win32s con un código de error 87: parámetro no válido.

LoadLibrary se realiza correctamente en un equipo que ejecuta Windows 98, Windows NT o Windows 2000 en esta situación. Sin embargo, el comportamiento de la llamada a funciones en el archivo DLL que hacen referencia a variables estáticas de TLS está definido. En Microsoft Windows 95, se produce un error de LoadLibrary y GetLastError función devuelve 1114 - ERROR_DLL_INIT_FAILED (una dynamic link library rutina de inicialización no se pudo). En Windows 2000, se realiza correctamente la función LoadLibrary . Sin embargo, cualquier intento de acceso a los datos TLS produce una infracción de acceso (AV).

Causa

Ésta es una limitación de LoadLibrary y __declspec. El espacio de variables globales para un subproceso se asigna en tiempo de ejecución. El tamaño se basa en un cálculo de los requisitos de la aplicación además de los requisitos de todas las bibliotecas que están vinculadas estáticamente. Si un archivo DLL utiliza TLS estático y está vinculado a la dinámica en una aplicación, cuando se llama a LoadLibrary o FreeLibrary , el sistema debe buscar todos los subprocesos que existen en el proceso y aumentan o compactar su memoria TLS según el tamaño de TLS estático en el archivo DLL recién cargado. Este proceso es demasiado para los sistemas operativos administrar, lo que puede producir una excepción cuando el archivo DLL se carga dinámicamente o referencias de los datos del código.

Solución

No se deben cargar las DLL que utilice __declspec(thread) mediante LoadLibrary.

Para utilizar estas funciones TLS como TlsAllocy asignar TLS si se puede cargar la DLL con LoadLibrary, se debe modificar el código del archivo DLL. O bien, el archivo DLL que utiliza __declspec(thread) sólo debe cargar implícitamente en la aplicación.

Más información

Para determinar si un archivo DLL utiliza TLS estático, la herramienta Dumpbin.exe puede utilizarse para volcar la información de encabezado. Un archivo DLL tiene TLS estático si los valores de encabezado opcional contiene un tamaño que sea mayor que 0 (cero) en el directorio de almacenamiento de información de subprocesos, como sigue:
RVA [18] [tamaño] 517B20 del directorio de almacenamiento de información de subprocesos

Propiedades

Id. de artículo: 118816 - Última revisión: sábado, 8 de junio de 2013 - Versión: 4.0
La información de este artículo se refiere a:
  • Microsoft Win32 Application Programming Interface sobre las siguientes plataformas
    • Microsoft Windows 98 Standard Edition
    • Microsoft Windows Millennium Edition
Palabras clave: 
kbdll kbkernbase kbprb kbthread kbmt KB118816 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): 118816

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