Criar DLLs C /C++ no Visual Studio

No Windows, uma biblioteca de vínculo dinâmico (DLL) é um tipo de arquivo executável que atua como uma biblioteca compartilhada de funções e recursos. A vinculação dinâmica é um recurso do sistema operacional. Ele permite que um executável chame funções ou use recursos armazenados em um arquivo separado. Essas funções e recursos podem ser compilados e implantados separadamente dos executáveis que os utilizam.

Uma DLL não é um executável autônomo. As DLLs são executadas no contexto dos aplicativos que os chamam. O sistema operacional carrega a DLL no espaço de memória de um aplicativo. Isso é feito quando o aplicativo é carregado (vinculação implícita) ou sob demanda no runtime (vinculação explícita). As DLLs também facilitam o compartilhamento de funções e recursos entre executáveis. Vários aplicativos podem acessar o conteúdo de uma única cópia de uma DLL na memória ao mesmo tempo.

Diferenças entre vinculação dinâmica e vinculação estática

A vinculação estática copia todo o código de objeto em uma biblioteca estática para os executáveis que a utilizam quando são compilados. A vinculação dinâmica inclui apenas as informações necessárias ao Windows em tempo de execução para localizar e carregar a DLL que contém um item de dados ou função. Ao criar uma DLL, você também cria uma biblioteca de importação que contém essas informações. Quando você cria um executável que chama a DLL, o vinculador usa os símbolos exportados na biblioteca de importação para armazenar essas informações para o carregador do Windows. Quando o carregador carrega uma DLL, a DLL é mapeada no espaço de memória do seu aplicativo. Se estiver presente, uma função especial na DLL, DllMain, é chamada para fazer qualquer inicialização que a DLL requeira.

Diferenças entre aplicativos e DLLs

Embora DLLs e aplicativos sejam módulos executáveis, eles diferem de várias maneiras. A diferença mais óbvia é que você não pode executar uma DLL. Do ponto de vista do sistema, há duas diferenças fundamentais entre aplicativos e DLLs:

  • Um aplicativo pode ter várias instâncias de si mesmo em execução simultaneamente no sistema. Uma DLL pode ter apenas uma instância.

  • Um aplicativo pode ser carregado como um processo. Ele pode ter coisas como uma pilha, threads de execução, memória global, manipuladores de arquivos e uma fila de mensagens. Uma DLL não pode ter essas coisas.

Vantagens de usar DLLs

A vinculação dinâmica ao código e aos recursos oferece várias vantagens sobre a vinculação estática:

  • A vinculação dinâmica salva a memória e reduz a permutação. Muitos processos podem usar uma DLL simultaneamente, compartilhando uma única cópia das partes somente leitura de uma DLL na memória. Por outro lado, cada aplicativo criado por meio de uma biblioteca vinculada estaticamente tem uma cópia completa do código da biblioteca que o Windows deve carregar na memória.

  • A vinculação dinâmica economiza espaço em disco e largura de banda. Muitos aplicativos podem compartilhar uma única cópia da DLL no disco. Por outro lado, cada aplicativo criado por meio de uma biblioteca vinculada estaticamente tem o código da biblioteca vinculado à sua imagem executável. Isso usa mais espaço em disco e requer mais largura de banda para transferência.

  • Manutenção, correções de segurança e atualizações podem ser mais fáceis. Quando seus aplicativos usam funções comuns em uma DLL, você pode implementar correções de bugs e atualizações na DLL. Quando as DLLs são atualizadas, os aplicativos que as usam não precisam ser recompilados ou revinculados. Eles podem usar a nova DLL assim que ela for implantada. Por outro lado, quando você faz correções no código de objeto vinculado estaticamente, deve revincular e reimplantar todos os aplicativos que o utilizam.

  • Você pode usar DLLs para fornecer suporte pós-venda. Por exemplo, uma DLL de driver de vídeo pode ser modificada para dar suporte a uma exibição que não estava disponível quando o aplicativo foi enviado.

  • Você pode usar a vinculação explícita para descobrir e carregar DLLs no runtime. Por exemplo, extensões de aplicativo que adicionam novas funcionalidades ao seu aplicativo sem recompilá-lo ou reimplantá-lo.

  • A vinculação dinâmica facilita o suporte a aplicativos escritos em diferentes linguagens de programação. Programas escritos em diferentes linguagens de programação podem chamar a mesma função DLL desde que os programas sigam a convenção de chamada da função. Os programas e a função DLL devem ser compatíveis das seguintes maneiras: a ordem na qual a função espera que seus argumentos sejam enviados por push para a pilha. Se a função ou o aplicativo é responsável por limpar a pilha. E se algum argumento é passado em registros.

  • A vinculação dinâmica fornece um mecanismo para estender as classes da biblioteca MFC (Microsoft Foundation Class). Você pode derivar classes das classes MFC existentes e colocá-las em uma DLL de extensão MFC para uso por aplicativos MFC.

  • A vinculação dinâmica facilita a criação de versões internacionais do seu aplicativo. As DLLs são uma maneira conveniente de fornecer recursos específicos à localidade, o que facilita muito a criação de versões internacionais de um aplicativo. Em vez de enviar muitas versões localizadas de seu aplicativo, você pode colocar as cadeias de caracteres e imagens para cada idioma em uma DLL de recurso separada. Em seguida, seu aplicativo pode carregar os recursos apropriados para essa localidade no runtime.

Uma desvantagem potencial para o uso de DLLs é que o aplicativo não é autônomo. Ele depende da existência de um módulo DLL separado que você deve implantar ou considerar como parte de sua instalação.

Mais informações sobre como criar e usar DLLs

Os artigos a seguir fornecem informações detalhadas sobre como criar DLLs C/C++ no Visual Studio.

Passo a passo: Criando e usando uma biblioteca de vínculo dinâmico (C++)
Descreve como criar e usar uma DLL com o Visual Studio.

Tipos de DLLs
Fornece informações sobre os diferentes tipos de DLLs que podem ser compilados.

Perguntas frequentes sobre DLL
Fornece respostas para perguntas frequentes sobre DLLs.

Vincular um executável a uma DLL
Descreve a vinculação explícita e implícita a uma DLL.

Inicializar uma DLL
Aborda o código de inicialização de DLL que deve ser executado quando sua DLL é carregada.

Comportamento de DLLs e da biblioteca em tempo de execução do Visual C++
Descreve a sequência de inicialização da DLL da biblioteca de runtime.

LoadLibrary e AfxLoadLibrary
Aborda o uso de LoadLibrary e AfxLoadLibrary para vincular explicitamente a uma DLL de runtime.

GetProcAddress
Aborda o uso de GetProcAddress para obter o endereço de uma função exportada na DLL.

FreeLibrary e AfxFreeLibrary
Aborda o uso de FreeLibrary e AfxFreeLibrary quando o módulo DLL não é mais necessário.

Ordem de pesquisa da biblioteca de vínculo dinâmico
Descreve o caminho de pesquisa que o sistema operacional Windows usa para localizar uma DLL no sistema.

Estados de módulo de uma DLL MFC regular dinamicamente ligada ao MFC
Descreve os estados do módulo de uma DLL do MFC regular vinculada dinamicamente ao MFC.

DLLs de extensão de MFC
Indica DLLs que normalmente implementam classes reutilizáveis derivadas das classes MFC existentes.

Criando uma DLL somente de recursos
Descreve uma DLL somente de recurso, que contém apenas recursos, como ícones, bitmaps, cadeias de caracteres e caixas de diálogo.

Recursos localizados em aplicativos MFC: DLLs satélites
Fornece suporte avançado para DLLs satélite, um recurso que ajuda na criação de aplicativos localizados para vários idiomas.

Importação e exportação
Descreve a importação de símbolos públicos para um aplicativo ou a exportação de funções de uma DLL

Tecnologia ativa e DLLs
Permite que servidores de objetos sejam implementados dentro de uma DLL.

Automação em uma DLL
Descreve o que a opção de automação no assistente de DLL do MFC fornece.

Convenções de nomenclatura para DLLs do MFC
Discute como as DLLs e as bibliotecas incluídas no MFC seguem uma convenção de nomenclatura estruturada.

Chamando funções DLL de aplicativos Visual Basic
Descreve como chamar funções de DLL a partir de aplicativos do Visual Basic.

Usar MFC como parte de uma DLL
Descreve DLLs do MFC regulares, que permitem que você use a biblioteca MFC como parte de uma biblioteca de vínculo dinâmico do Windows.

Versão DLL do MFC
Descreve como você pode usar as bibliotecas de vínculo dinâmico compartilhadas MFCxx.dll e MFCxxD.dll (onde x é o número da versão do MFC) com aplicativos MFC e DLLs de extensão MFC.