Compartilhar via


Exportando a partir de uma DLL usando arquivos DEF

Arquivo de definição de módulo (.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 de DLL, a DLL exige um arquivo .def.

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

  • A primeira declaração no arquivo deve ser a instrução LIBRARY. Essa 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 declaração EXPORTS lista os nomes e, opcionalmente, os valores ordinais das funções exportadas pela DLL. Atribua à função um valor ordinal seguindo o nome da função com um sinal de arroba (@) e um número. Ao especificar valores ordinais, eles devem estar no intervalo de 1 a N, onde N é o número de funções exportadas pela DLL. Se você deseja exportar funções por ordinal, consulte Exportar 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 busca binária pode parecer com o seguinte:

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 criará um arquivo .def de esqueleto para você e o adicionará automaticamente ao projeto. Adicione os nomes das funções a serem exportadas para este arquivo. Para as DLLs não MFC, você mesmo deve criar o arquivo .def e adicioná-lo ao seu projeto.

Se você estiver exportando as funções em um arquivo C++, você precisa colocar os nomes decorados no arquivo .def ou definir suas funções exportadas com ligação padrão de C usando "C" externo. Se precisar colocar os nomes decorados no arquivo .def, você poderá obtê-los usando a ferramenta DUMPBIN ou usando a opção /MAP do vinculador. Observe que os nomes decorados gerados pelo compilador são específicos de compilador. Se você colocar os nomes decorados produzidos pelo compilador do Visual C++ em um arquivo .def, os aplicativos vinculados à DLL também deverão ser compilados usando-se a mesma versão do Visual C++, de forma que os nomes decorados no aplicativo correspondente sejam iguais aos nomes exportados no .def da DLL.

Se você estiver criando uma DLL de extensão e estiver exportando usando um arquivo .def, coloque o seguinte código no início e no fim de seus 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 variáveis MFC usadas internamente ou que tenham sido adicionadas às suas classes sejam exportadas (ou importadas) de sua DLL de extensão. Por exemplo, ao derivar uma classe usando DECLARE_DYNAMIC, a macro se expande para adicionar uma variável de membro CRuntimeClass à sua classe. Ignorar essas quatro linhas pode fazer com que o DLL compile ou vincule incorretamente, ou cause um erro ao vincular o aplicativo do cliente a 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). O vinculador então usa o arquivo de exportação para criar o arquivo DLL. Executáveis vinculados implicitamente ao link da DLL para a biblioteca de importações quando eles são compilados.

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

O que você deseja fazer?

Que você deseja saber mais?

Consulte também

Conceitos

Exportando a partir de uma DLL