Compartilhar via


vinculação dinâmica Run-Time

Quando o aplicativo chama as funções LoadLibrary ou LoadLibraryEx , o sistema tenta localizar a DLL (para obter detalhes, consulte Ordem de Pesquisa da Biblioteca de Vínculo Dinâmico). Se a pesquisa for bem-sucedida, o sistema mapeará o módulo DLL para o espaço de endereço virtual do processo e incrementará a contagem de referência. Se a chamada para LoadLibrary ou LoadLibraryEx especificar uma DLL cujo código já está mapeado para o espaço de endereço virtual do processo de chamada, a função simplesmente retornará um identificador para a DLL e incrementará a contagem de referência de DLL. Observe que duas DLLs que têm o mesmo nome e extensão de arquivo base, mas encontradas em diretórios diferentes, não são consideradas a mesma DLL.

O sistema chama a função de ponto de entrada no contexto do thread que chamou LoadLibrary ou LoadLibraryEx. A função de ponto de entrada não será chamada se a DLL já tiver sido carregada pelo processo por meio de uma chamada para LoadLibrary ou LoadLibraryEx sem nenhuma chamada correspondente para a função FreeLibrary .

Se o sistema não conseguir localizar a DLL ou se a função de ponto de entrada retornar FALSE, LoadLibrary ou LoadLibraryEx retornará NULL. Se LoadLibrary ou LoadLibraryEx for bem-sucedido, ele retornará um identificador para o módulo DLL. O processo pode usar esse identificador para identificar a DLL em uma chamada para a função GetProcAddress, FreeLibrary ou FreeLibraryAndExitThread .

A função GetModuleHandle retorna um identificador usado em GetProcAddress, FreeLibrary ou FreeLibraryAndExitThread. A função GetModuleHandle só terá êxito se o módulo DLL já estiver mapeado para o espaço de endereço do processo por meio da vinculação de tempo de carga ou por uma chamada anterior para LoadLibrary ou LoadLibraryEx. Ao contrário de LoadLibrary ou LoadLibraryEx, GetModuleHandle não incrementa a contagem de referência do módulo. A função GetModuleFileName recupera o caminho completo do módulo associado a um identificador retornado por GetModuleHandle, LoadLibrary ou LoadLibraryEx.

O processo pode usar GetProcAddress para obter o endereço de uma função exportada na DLL usando um identificador de módulo DLL retornado por LoadLibrary ou LoadLibraryEx, GetModuleHandle.

Quando o módulo DLL não é mais necessário, o processo pode chamar FreeLibrary ou FreeLibraryAndExitThread. Essas funções decrementam a contagem de referência do módulo e desmapeam o código DLL do espaço de endereço virtual do processo se a contagem de referência for zero.

A vinculação dinâmica em tempo de execução permite que o processo continue em execução mesmo se uma DLL não estiver disponível. Em seguida, o processo pode usar um método alternativo para atingir seu objetivo. Por exemplo, se um processo não conseguir localizar uma DLL, ele poderá tentar usar outra ou notificar o usuário sobre um erro. Se o usuário puder fornecer o caminho completo da DLL ausente, o processo poderá usar essas informações para carregar a DLL, mesmo que ela não esteja no caminho de pesquisa normal. Essa situação contrasta com a vinculação de tempo de carga, na qual o sistema simplesmente encerra o processo se não conseguir encontrar a DLL.

A vinculação dinâmica em tempo de execução poderá causar problemas se a DLL usar a função DllMain para executar a inicialização de cada thread de um processo, pois o ponto de entrada não é chamado para threads que existiam antes de LoadLibrary ou LoadLibraryEx ser chamado. Para obter um exemplo mostrando como lidar com esse problema, consulte Usando o armazenamento local de thread em uma biblioteca de Dynamic-Link.

Usando a vinculação dinâmica em tempo de execução