Criação de biblioteca de vínculo dinâmico
Para criar uma Biblioteca de vínculo dinâmico (DLL), você deve criar um ou mais arquivos de código-fonte e, possivelmente, um arquivo vinculador para exportar as funções. Se você planeja permitir que aplicativos que usam sua DLL usem vinculação dinâmica de tempo de carregamento, você também deve criar uma biblioteca de importação.
Criação de arquivos de origem
Os arquivos de origem de uma DLL contêm funções e dados exportados, funções e dados internos e uma função de ponto de entrada opcional para a DLL. Você pode usar qualquer ferramenta de desenvolvimento que ofereça suporte à criação de DLLs baseadas no Windows.
Se sua DLL pode ser usada por um aplicativo multithreaded, então você deve tornar sua DLL “thread-safe”. Para evitar a corrupção de dados, você precisará sincronizar o acesso a todos os dados globais da DLL. Você também precisa garantir a vinculação somente com bibliotecas que são thread-safe também. Por exemplo, o Microsoft Visual C++ contém várias versões da biblioteca de tempo de execução C, uma que não é thread-safe e duas que são.
Exportação de funções
Como você especifica quais funções em uma DLL devem ser exportadas depende das ferramentas que você está usando para desenvolvimento. Alguns compiladores permitem exportar uma função diretamente no código-fonte usando um modificador na declaração de função. Em outras ocasiões, precisa especificar exportações em um arquivo que você passa para o vinculador.
Por exemplo, usando o Visual C++, há duas maneiras possíveis de exportar funções DLL: com o modificador__declspec(dllexport) ou com um arquivo de definição de módulo (.def
). Se você usar o modificador __declspec(dllexport), não será necessário usar um .def
arquivo. Para obter mais informações, consulte Exportação de uma DLL.
Criação de uma biblioteca de importação
Um arquivo de biblioteca de importação (.lib
) contém informações que o vinculador precisa para resolver referências externas a funções DLL exportadas, para que o sistema possa localizar a DLL especificada e as funções DLL exportadas em tempo de execução. Você pode criar uma biblioteca de importação para sua DLL ao compilar a DLL.
Para obter mais informações, consulte Criação de uma biblioteca de importação e de arquivo de exportação.
Uso de uma biblioteca de importação
Por exemplo, para chamar a função CreateWindow, você deve vincular seu código com a biblioteca de importação User32.lib
. O motivo é que CreateWindow reside em uma DLL do sistema chamada User32.dll
, e User32.lib
é a biblioteca de importação usada para resolver as chamadas em seu código para funções exportadas em User32.dll
. O vinculador cria uma tabela que contém o endereço de cada chamada de função. Chamadas para funções em uma DLL serão corrigidas quando a DLL for carregada. Enquanto o sistema está inicializando o processo, ele carrega User32.dll
, porque o processo depende de funções exportadas nessa DLL e atualiza as entradas na tabela de endereços de função. Todas as chamadas para CreateWindow invocam a função exportada do User32.dll
.
Para obter mais informações, consulte Vincular um executável a uma DLL.