Compartilhar via


Sobre bibliotecas de Dynamic-Link

A vinculação dinâmica permite que um módulo inclua apenas as informações necessárias para localizar uma função de DLL exportada no tempo de carregamento ou no tempo de execução. A vinculação dinâmica difere da vinculação estática mais familiar, na qual o vinculador copia o código de uma função de biblioteca em cada módulo que a chama.

Tipos de vinculação dinâmica

Há dois métodos para chamar uma função em uma DLL:

  • Na vinculação dinâmica de tempo de carga, um módulo faz chamadas explícitas para funções de DLL exportadas como se fossem funções locais. Isso exige que você vincule o módulo à biblioteca de importação para a DLL que contém as funções. Uma biblioteca de importação fornece ao sistema as informações necessárias para carregar a DLL e localizar as funções de DLL exportadas quando o aplicativo é carregado.
  • Na vinculação dinâmica em tempo de execução, um módulo usa a função LoadLibrary ou LoadLibraryEx para carregar a DLL em tempo de execução. Depois que a DLL é carregada, o módulo chama a função GetProcAddress para obter os endereços das funções de DLL exportadas. O módulo chama as funções de DLL exportadas usando os ponteiros de função retornados por GetProcAddress. Isso elimina a necessidade de uma biblioteca de importação.

DLLs e gerenciamento de memória

Cada processo que carrega a DLL o mapeia para seu espaço de endereço virtual. Depois que o processo carrega a DLL em seu endereço virtual, ele pode chamar as funções de DLL exportadas.

O sistema mantém uma contagem de referência por processo para cada DLL. Quando um thread carrega a DLL, a contagem de referência é incrementada em um. Quando o processo é encerrado ou quando a contagem de referência se torna zero (somente vinculação dinâmica em tempo de execução), a DLL é descarregada do espaço de endereço virtual do processo.

Como qualquer outra função, uma função de DLL exportada é executada no contexto do thread que a chama. Portanto, as seguintes condições se aplicam:

  • Os threads do processo que chamou a DLL podem usar identificadores abertos por uma função DLL. Da mesma forma, os identificadores abertos por qualquer thread do processo de chamada podem ser usados na função DLL.
  • A DLL usa a pilha do thread de chamada e o espaço de endereço virtual do processo de chamada.
  • A DLL aloca memória do espaço de endereço virtual do processo de chamada.

Para obter mais informações sobre DLLs, consulte os seguintes tópicos: