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

Traduções deste artigo Traduções deste artigo
ID do artigo: 118816 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Sintomas

Uma biblioteca de vínculo dinâmico (DLL) usa __declspec (thread) para alocar armazenamento local de thread estático (TLS). Há não problemas associados à execução um aplicativo que está vinculado com a biblioteca estática correspondente. No entanto, quando um aplicativo usa a função LoadLibrary carregar a DLL em vez de usar a versão estática, LoadLibrary Falha em Win32s com um código de erro 87: parâmetro inválido.

LoadLibrary é bem-sucedida em um computador que está executando o Windows 98, Windows NT ou Windows 2000 nessa situação. No entanto, o comportamento de chamar funções na DLL que fazem referência a variáveis estáticas do TLS é indefinido. No Microsoft Windows 95, falha de LoadLibrary e GetLastError funcionam retorna 1114 - ERROR_DLL_INIT_FAILED (uma rotina de inicialização de biblioteca vínculo dinâmico falha). No Windows 2000, a função LoadLibrary obtiver êxito. No entanto, qualquer tentativa de acessar os dados TLS causa uma violação de acesso (VA).

Causa

Esta é uma limitação do LoadLibrary e __declspec . O espaço de variável global para um segmento é alocado em tempo de execução. O tamanho baseia-se em um cálculo de requisitos do aplicativo mais os requisitos de todas as bibliotecas vinculadas estaticamente. Se uma DLL usa o TLS estático e dinâmico vinculadas em um aplicativo, quando LoadLibrary ou FreeLibrary é chamado, o sistema deve encontrar todos os threads que existe no processo e ampliam ou compactar sua memória TLS acordo com para o tamanho do TLS estático na DLL recém-carregada. Esse processo é muito grande para sistemas operacionais gerenciar, que pode causar uma exceção quando a DLL é carregada dinamicamente ou código referências as dados.

Resolução

DLLs que usam __declspec (thread) não devem ser carregadas com LoadLibrary .

O código DLL deve ser modificado para usar funções, TLS como TlsAlloc e alocar TLS se a DLL pode ser carregada com LoadLibrary . Ou, a DLL que está usando __declspec (thread) somente deve ser carregada implicitamente no aplicativo.

Mais Informações

Para determinar se uma DLL usa TLS estático, a ferramenta dumpbin.exe pode ser usada para despejar as informações de cabeçalho. Uma DLL possui TLS estático se os valores de cabeçalho OPTIONAL contém um tamanho maior do que 0 (zero) no diretório de armazenamento de thread, da seguinte maneira:
517B20 RVA [tamanho] [18] de diretório de armazenamento de thread

Propriedades

ID do artigo: 118816 - Última revisão: terça-feira, 21 de novembro de 2006 - Revisão: 3.2
A informação contida neste artigo aplica-se a:
  • Interface de Programação de Aplicativos do Microsoft Win32 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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes 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