Partilhar via


Exportando de uma DLL usando arquivos DEF

Um arquivo de definição de módulo ou DEF (*.def) é um arquivo de texto que contém uma ou mais instruções de módulo que descrevem vários atributos de uma DLL. Se você não estiver usando a palavra-chave __declspec(dllexport) para exportar as funções da DLL, a DLL exigirá um arquivo DEF.

Um arquivo DEF mínimo deve conter as seguintes instruções de definição de módulo:

  • A primeira instrução no arquivo deve ser a instrução LIBRARY. Esta instrução identifica o arquivo DEF como pertencente a uma DLL. A instrução LIBRARY é seguida pelo nome da DLL. O vinculador coloca esse nome na biblioteca de importação da DLL.

  • A instrução EXPORTS lista os nomes e, opcionalmente, os valores ordinais das funções exportadas pela DLL. Você atribui à função um valor ordinal após o nome da função com um sinal (@) e um número. Quando você especifica valores ordinais, eles devem estar no intervalo de 1 a N, em que N é o número de funções exportadas pela DLL. Se você quiser exportar funções por ordinal, confira neste tópico e em Exportar funções com base em uma DLL por ordinal e não por nome.

Por exemplo, uma DLL que contém o código para implementar uma árvore de pesquisa binária pode ter a seguinte aparência:

LIBRARY   BTREE
EXPORTS
   Insert   @1
   Delete   @2
   Member   @3
   Min   @4

Se você usar o Assistente de DLL do MFC para criar uma DLL do MFC, o assistente criará um arquivo DEF de esqueleto para você e o adicionará automaticamente ao seu projeto. Adicione os nomes das funções a serem exportadas para este arquivo. Para DLLs que não são do MFC, crie o arquivo DEF por conta própria e adicione-o ao seu projeto. Em seguida, acesse Projeto>Propriedades>Vinculador>Entrada>Arquivo de Definição do Módulo e insira o nome do arquivo DEF. Repita esta etapa para cada configuração e plataforma ou faça tudo de uma vez selecionando Configuração = Todas as Configurações e Plataforma = Todas as Plataformas.

Se você estiver exportando funções em um arquivo do C++, deverá colocar os nomes decorados no arquivo DEF ou definir as funções exportadas com a vinculação padrão do C usando o extern "C". Se você precisar colocar os nomes decorados no arquivo DEF, poderá obtê-los usando a ferramenta DUMPBIN ou usando a opção /MAP do vinculador. Observe que os nomes decorados produzidos pelo compilador são específicos do compilador. Se você colocar os nomes decorados produzidos pelo MSVC (compilador do Microsoft C++) em um arquivo DEF, os aplicativos que se vinculam à DLL também deverão ser criados usando a mesma versão do MSVC para que os nomes decorados no aplicativo de chamada correspondam aos nomes exportados no arquivo DEF da DLL.

Observação

Uma DLL criada com o Visual Studio 2015 pode ser consumida por aplicativos criados com o Visual Studio 2017 ou o Visual Studio 2019.

Se você estiver criando uma DLL de extensão e exportando com o uso de um arquivo DEF, coloque o seguinte código no início e no final dos arquivos de cabeçalho que contêm as classes exportadas:

#undef AFX_DATA
#define AFX_DATA AFX_EXT_DATA
// <body of your header file>
#undef AFX_DATA
#define AFX_DATA

Essas linhas garantem que as variáveis do MFC que são usadas internamente ou adicionadas às suas classes sejam exportadas (ou importadas) de sua DLL de extensão do MFC. Por exemplo, ao derivar uma classe usando DECLARE_DYNAMIC, a macro se expande para adicionar uma variável de membro CRuntimeClass à sua classe. Deixar essas quatro linhas de fora poderá fazer com que a DLL compile ou vincule incorretamente ou cause um erro quando o aplicativo cliente for vinculado à DLL.

Ao criar a DLL, o vinculador usa o arquivo DEF para criar um arquivo de exportação (.exp) e um arquivo da biblioteca de importação (.lib). Em seguida, o vinculador usa o arquivo de exportação para compilar o arquivo DLL. Executáveis que se vinculam implicitamente à DLL vinculam-se à biblioteca de importação quando são criados.

Observe que o próprio MFC usa arquivos DEF para exportar funções e classes do MFCx0.dll.

O que você deseja fazer?

Que mais você deseja saber?

Confira também

Exportando de uma DLL