Share via


Determinar qual método usar vinculação

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

Vinculação implícita

A vinculação implícita ocorre quando o código do aplicativo chama uma função DLL exportada.Quando o código-fonte para o executável de telefonar é compilado ou montado, a telefonar 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 para implementar chamadas a 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 às DLLs, o vinculador simplesmente adiciona informações ao arquivo executável que informa ao sistema onde encontrar o código da DLL quando o processo é iniciado.

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

Se qualquer DLL 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 de partida para as funções DLL.

Assim como o resto do código do programa, código DLL é mapeado no espaço de endereço do processo quando o processo é inicializado e será carregado na memória somente quando necessário.sistema autônomo resultado, a PRÉ-CARREGAMENTO and LOADONCALL código atributos usados pelo .def arquivos ao controle de carregamento em versões anteriores do Windows não têm significado.

Vinculação explícita

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

  • O aplicativo não sabe o nome de uma DLL que ele terá de carregar até o time 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 durante a inicialização do processo.Um processo usando vinculação explícito não terminado nessa situação e pode tentar corrigir o 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 uma das DLLs é vinculado para ter um DllMain função falhará. Um processo usando vinculação explícito não é finalizado nessa situação.

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

  • Vinculando explícita elimina a necessidade de vincular o aplicativo com uma biblioteca de importação.Se as alterações na DLL podem fazer com que a exportar ordinais alterar, aplicativos que usam vinculação explícito não são necessário vincular novamente (supondo que estão 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 necessário vincular novamente para a biblioteca de importação novo.

Aqui estão dois riscos de vincular explícita estar atento:

  • 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 é telefonar se a DLL já está anexada ao processo por causa de uma telefonar anterior a LoadLibrary com nenhuma telefonar correspondente para o FreeLibrary função.Vinculando explícitas pode causar problemas se a DLL estiver usando um DllMain função de executar a inicialização para cada thread de um processo porque threads existentes quando LoadLibrary (or AfxLoadLibrary) é chamado será não ser inicializado.

  • Se uma DLL declara estática extensão dados sistema autônomo __declspec(thread), ela pode causar uma falha de proteção se explicitamente vinculado.Após a DLL é carregada com LoadLibrary, ele causa uma falha de proteção sempre que o código faz referência a esses dados.(Dados estático extensão incluem itens estático global e locais.) Portanto, quando você cria uma DLL, você deve tanto evitar o uso de armazenamento thread local ou informar DLL usuários sobre possíveis armadilhas (no caso de eles tentarem carregamento dinâmico).

O que você deseja fazer?

O que você deseja saber mais sobre?

Consulte também

Conceitos

Vinculando um executável a uma DLL