Você está offline; aguardando reconexão

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

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
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
1.10 1,20 3.50

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 118816 - Última Revisão: 11/21/2006 15:29:52 - Revisão: 3.2

Interface de Programação de Aplicativos do Microsoft Win32

  • kbmt kbdll kbkernbase kbprb kbthread KB118816 KbMtpt
Comentários