Run-Time Ligação dinâmica
Quando o aplicativo chama o LoadLibrary ou funções de LoadLibraryEx, o sistema tenta localizar a DLL (para obter detalhes, consulte Dynamic-Link Library Search Order). Se a pesquisa for bem-sucedida, o sistema mapeia o módulo DLL no espaço de endereço virtual do processo e incrementa a contagem de referência. Se a chamada para LoadLibrary ou LoadLibraryEx especificar uma DLL cujo código já está mapeado no espaço de endereço virtual do processo de chamada, a função simplesmente retorna um identificador para a DLL e incrementa a contagem de referência de DLL. Observe que duas DLLs que têm o mesmo nome de arquivo base e extensão, mas 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 chamado LoadLibrary ou LoadLibraryEx. A função de ponto de entrada não é chamada se a DLL já foi carregada pelo processo através de uma chamada para LoadLibrary ou LoadLibraryEx sem nenhuma chamada correspondente para a função FreeLibrary.
Se o sistema não conseguir encontrar 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 o GetProcAddress, FreeLibrary ou função FreeLibraryAndExitThread.
A função GetModuleHandle retorna um identificador usado em GetProcAddress, FreeLibraryou FreeLibraryAndExitThread. O função GetModuleHandle terá êxito somente se o módulo DLL já estiver mapeado no espaço de endereço do processo por vinculação de tempo de carregamento ou por uma chamada anterior para LoadLibrary ou LoadLibraryEx. Ao contrário LoadLibrary ou LoadLibraryEx, GetModuleHandle não incrementa a contagem de referência do módulo. A funçãoGetModuleFileName recupera 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 LoadLibraryExGetModuleHandle.
Quando o módulo DLL não é mais necessário, o processo pode chamar FreeLibrary ou FreeLibraryAndExitThread. Essas funções diminuem a contagem de referência do módulo e desmapeiam 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. O processo pode então usar um método alternativo para atingir seu objetivo. Por exemplo, se um processo não conseguir localizar uma DLL, ele pode tentar usar outra ou pode 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 carregamento, 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 pode causar problemas se a DLL usar a função DllMain para executar a inicialização para cada thread de um processo, porque 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 de thread em uma biblioteca Dynamic-Link.
Tópicos relacionados
-
Usando o de vinculação dinâmica em tempo de execução