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 __declspec(dllexport) palavra-chave para exportar as funções da DLL, a DLL requer 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 seguindo o nome da função com um sinal de arroba (@) e um número. Quando você especifica valores ordinais, eles devem estar no intervalo de 1 a N, onde N é o número de funções exportadas pela DLL. Se você quiser exportar funções por ordinal, consulte Exportando funções de uma DLL por ordinal em vez de por nome , bem como este tópico.

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 MFC para criar uma DLL MFC, o assistente cria um arquivo DEF esqueleto para você e o adiciona automaticamente ao seu projeto. Adicione os nomes das funções a serem exportadas para este arquivo. Para DLLs não-MFC, crie o arquivo DEF você mesmo e adicione-o ao seu projeto. Em seguida, vá para Project>Properties>Linker>Input>Module Definition File e digite 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 estiver a exportar funções num ficheiro C++, terá de colocar os nomes decorados no ficheiro DEF ou definir as suas funções exportadas com ligação C padrão usando extern "C". Se você precisar colocar os nomes decorados no arquivo DEF, você pode obtê-los usando a ferramenta DUMPBIN ou usando a opção linker /MAP . Note que os nomes decorados produzidos pelo compilador são específicos do compilador. Se você colocar os nomes decorados produzidos pelo compilador Microsoft C++ (MSVC) em um arquivo DEF, os aplicativos vinculados à sua DLL também devem 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 estiver a criar uma DLL de extensão e a exportar usando um arquivo DEF, coloque o seguinte código no início e no final dos ficheiros 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 MFC que são usadas internamente ou que são adicionadas às suas classes são exportadas (ou importadas) da sua extensão MFC DLL. Por exemplo, ao derivar uma classe usando DECLARE_DYNAMIC, a macro se expande para adicionar uma CRuntimeClass variável de membro à sua classe. Deixar de fora essas quatro linhas pode fazer com que sua DLL compile ou vincule incorretamente ou cause um erro quando o aplicativo cliente se vincula à DLL.

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

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

O que pretende fazer?

Sobre o que quer saber mais?

Ver também

Exportando de uma DLL