Partilhar via


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

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

A 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 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 de funções na DLL. Localizar uma função externa em uma biblioteca de importação informa o vinculador que o código para essa função está em uma DLL. Para resolver referências externas para DLLs, o vinculador simplesmente adiciona informações para o 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 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 relata o erro.

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

Igual ao restante do código de um programa, o código da DLL é mapeado no espaço de endereço do processo quando o processo é iniciado e ele é 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.

A vinculação explícita

A maioria dos aplicativos usar vinculação implícita porque ele é o método mais fácil de vinculação para usar. No entanto, há tempos quando vinculação 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 tempo de execução. Por exemplo, o aplicativo pode precisar obter o nome da DLL e as funções exportadas a partir 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 vinculação explícita nessa situação, não está finalizado e pode tentar recuperar do erro. Por exemplo, o processo pode notificar o usuário sobre o erro e peça 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 ao ter um DllMain funcionar falhar. Um processo usando vinculação explícita não é encerrado 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 carrega. Para melhorar o desempenho de inicialização, um aplicativo pode vincular implicitamente as DLLs necessárias imediatamente após o carregamento e espera para vincular as outras DLLs explicitamente quando forem necessários.

  • A vinculação explícita elimina a necessidade de vincular o aplicativo com uma biblioteca de importação. Se as alterações na DLL causarem ordinais a exportação alterar, aplicativos usando vinculação explícita não é necessário vincular novamente (supondo que eles estão chamando GetProcAddress com um nome de uma função e não com um valor ordinal), enquanto os aplicativos usando vinculação implícita necessário vincular novamente para a nova biblioteca de importação.

Aqui estão dois riscos de vinculação explícita para estar ciente:

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

  • Se uma DLL declara extensão estática dados como __declspec(thread), ela 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ática incluem globais e locais de itens estáticos.) Portanto, quando você cria uma DLL, você deve evitar usar o armazenamento local de segmento 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 a respeito?

Consulte também

Conceitos

Vinculando um executável para uma DLL.