Partilhar via


Determinar qual método de vinculação para usar

Há dois tipos de vinculação: vinculação implícita e explícita de vinculação.

Vinculação implícita

Vinculação implícita ocorre quando o código do aplicativo chama uma função de DLL exportada.Quando o código-fonte para o executável de chamada é compilado ou montado, a chamada de função DLL gera uma referência de função externa no código do objeto.Para resolver essa referência externa, o aplicativo deve vincular com a biblioteca de importação (arquivo. lib) fornecida pelo fabricante da DLL.

A biblioteca de importação contém apenas o código para carregar a DLL e implementar chamadas para funções na DLL.Localizando uma função externa em uma biblioteca de importação informa o vinculador que é o código para essa função em uma DLL.Para resolver referências externas para DLLs, o vinculador simplesmente adiciona informações para o arquivo executável que informa o sistema onde encontrar o código da DLL quando o processo é iniciado.

Quando o sistema inicia um programa que contém referências vinculadas dinamicamente, ele usa as informações no arquivo executável do programa para localizar as DLLs necessárias.Se ele não localizar a DLL, o sistema encerra o processo e exibe uma caixa de diálogo que informa o erro.Caso contrário, o sistema mapeia os módulos DLL no espaço de endereço do processo.

Se qualquer uma das DLLs tem uma função de ponto de entrada (para código de inicialização e encerramento), o sistema operacional chama a função.Um dos parâmetros passados para a função de ponto de entrada especifica um código que indica a DLL é anexar ao processo.Se a função de ponto de entrada não retornar TRUE, o sistema encerra o processo e informa o erro.

Finalmente, o sistema modifica o código executável do processo para fornecer endereços inicial para as funções DLL.

Como o restante do código do programa, código da DLL é mapeado no espaço de endereço do processo quando o processo é iniciado e é carregado na memória somente quando necessário.Como resultado, o PRELOAD e LOADONCALL atributos de código usados pelos arquivos. def para controle de carregamento em versões anteriores do Windows não têm significado.

Vinculando explícita

A maioria dos aplicativos usar vinculação implícita porque é o método mais fácil de vinculação para usar.No entanto, há vezes quando vinculação explícita é necessária.Aqui estão alguns motivos comuns para usar vinculação explícita:

  • O aplicativo não sabe o nome de uma DLL que ele terá de carregar até o tempo de execução.Por exemplo, o aplicativo pode precisar obter o nome da DLL e as funções exportadas de um arquivo de configuração.

  • Um processo usando vinculação implícita é encerrado pelo sistema operacional se a DLL não for encontrada na inicialização do processo.Um processo usando explícita de vinculação não está finalizado nessa situação e pode tentar recuperar do erro.Por exemplo, o processo pode notificar o usuário sobre o erro e que o usuário especifique outro caminho para a DLL.

  • Um processo usando vinculação implícita também é encerrado se qualquer dll está vinculado para ter uma DllMain função falhará.Um processo usando explícita de vinculação não está finalizado nessa situação.

  • Um aplicativo que implicitamente links para várias DLLs pode ser lento para iniciar porque o Windows carrega todas as DLLs quando o aplicativo é carregado.Para melhorar o desempenho de inicialização, um aplicativo implicitamente possível vincular as DLLs necessárias imediatamente após o carregamento e espera para explicitamente vincular a outras DLLs quando forem necessários.

  • Vinculando explícita elimina a necessidade de vincular o aplicativo com uma biblioteca de importação.Se as alterações na DLL causar os ordinais de exportação alterar, aplicativos usando explícita de vinculação não têm que revincular (supondo que está chamando GetProcAddress com um nome de uma função e não com um valor ordinal), enquanto os aplicativos que usam vinculação implícita devem vincular novamente para a nova biblioteca de importação.

Aqui estão dois riscos da vinculação explícito estar ciente:

  • Se a DLL tiver um DllMain função de ponto de entrada, o sistema operacional chama a função no contexto do thread que chamou LoadLibrary.A função de ponto de entrada não é chamada se a DLL já está anexada ao processo por causa de uma chamada anterior a LoadLibrary com nenhuma chamada correspondente para o FreeLibrary função.Vinculando explícita pode causar problemas se a DLL estiver usando um DllMain função executar inicialização para cada segmento de um processo porque segmentos existentes quando LoadLibrary (ou AfxLoadLibrary) é chamado será não ser inicializado.

  • Se uma DLL declara dados de extensão estático como __declspec(thread), ele pode causar uma falha de proteção se explicitamente vinculado.Depois que a DLL é carregada com LoadLibrary, faz com que uma falha de proteção sempre que o código faz referência a esses dados.(Dados de extensão estático incluem itens estáticos globais e locais.) Portanto, quando você cria uma DLL, você deve evitar usar armazenamento thread local ou informar os usuários DLL sobre possíveis armadilhas (caso eles tentarão carregamento dinâmico).

O que você deseja fazer?

O que você deseja saber mais sobre?

Consulte também

Conceitos

Vinculando um executável para uma DLL