PROBLEMA: Chamada LoadLibrary() para carregar uma DLL com TLS estático

Traduções de Artigos Traduções de Artigos
Artigo: 118816 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Sintomas

Uma biblioteca de ligação dinâmica (DLL) utiliza __declspec (thread) para atribuir o armazenamento local de thread estático (TLS). Existem sem problemas associados à execução uma aplicação que está ligada com a biblioteca estática correspondente. No entanto, quando uma aplicação utiliza a função LoadLibrary carregar a DLL em vez de utilizar a versão estática, LoadLibrary falhar no Win32s com um código de erro 87: parâmetro inválido.

LoadLibrary com êxito num computador com o Windows 98, Windows NT ou Windows 2000 nesta situação. No entanto, o comportamento de chamar funções na DLL que referenciam variáveis TLS estáticas é indefinido. No Microsoft Windows 95, falha de LoadLibrary e GetLastError funcionam devolve 1114 - ERROR_DLL_INIT_FAILED (uma rotina de inicialização de biblioteca de ligação dinâmica falhou). No Windows 2000, a função LoadLibrary com êxito. No entanto, qualquer tentativa de aceder aos dados TLS provoca uma violação de acesso (AV).

Causa

Esta é uma limitação de LoadLibrary e __declspec . O espaço variável global para um thread é atribuído no tempo de execução. O tamanho se baseia um cálculo de requisitos da aplicação em conjunto com os requisitos de todas as bibliotecas estaticamente ligadas. Se uma DLL utiliza a TLS estático e é ligado dinâmicos numa aplicação, quando é chamado LoadLibrary ou FreeLibrary , o sistema deve encontrar todos os threads que existam no processo e ampliar ou compactar as respectivas memória TLS acordo com para o tamanho de TLS estático na DLL recentemente carregado. Este processo é muito para sistemas operativos gerir, que pode causar uma excepção quando a DLL é carregada dinamicamente ou código referências as dados.

Resolução

DLL que utilizam __declspec (thread) não devem ser carregadas com LoadLibrary .

O código DLL deve ser modificado para utilizar estas funções TLS como TlsAlloc e atribuir TLS se pode ser carregada a DLL com LoadLibrary . Ou, a DLL que está a utilizar __declspec (thread) deve apenas ser implicitamente carregada para a aplicação.

Mais Informação

Para determinar se uma DLL utiliza TLS estático, a ferramenta de Dumpbin.exe pode ser utilizada para copiar as informações do cabeçalho. Uma DLL tem TLS estáticas se HEADER valores OPCIONAIS contém um tamanho superior a 0 (zero) no directório de armazenamento de thread, da seguinte forma:
517B20 [18] RVA [tamanho] do thread do armazenamento

Propriedades

Artigo: 118816 - Última revisão: 21 de novembro de 2006 - Revisão: 3.2
A informação contida neste artigo aplica-se a:
  • Microsoft Win32 Application Programming Interface nas seguintes plataformas
    • Microsoft Windows 95
    • Microsoft Windows 98 Standard Edition
    • the operating system: Microsoft Windows 2000
    • Microsoft Windows Millennium Edition
    • Microsoft Windows NT 4.0
    • the operating system: Microsoft Windows XP
Palavras-chave: 
kbmt kbdll kbkernbase kbprb kbthread KB118816 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 118816

Submeter comentários

 

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