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 Dynamic-Link Library Search Order). 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 de arquivo base e extensão, mas que são 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çãoFreeLibrary.

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 oGetProcAddress, FreeLibraryou função FreeLibraryAndExitThread.

A funçãoGetModuleHandleretorna um identificador usado em GetProcAddress, FreeLibraryou 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 vinculando o 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çãoGetModuleFileNamerecupera o caminho completo do módulo associado a um identificador retornado por GetModuleHandle, LoadLibraryou 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 desapamam 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 de 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 encerrará 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 é chamado. Para obter um exemplo mostrando como lidar com esse problema, consulte Usando o Armazenamento Local do Thread em umda Biblioteca de Dynamic-Link.

usando de vinculação dinâmica em tempo de execução