Compartilhar via


Exportando a partir de uma DLL usando __declspec(dllexport)

A Microsoft introduziu __export na versão de 16 bits do compilador do Visual C++ para permitir que ele gere os nomes de exportação automaticamente e os coloque em um arquivo .lib. Este arquivo .lib pode então ser usado apenas como um .lib estático para vincular a uma DLL.

Em versões mais recentes do compilador, você pode exportar dados, funções, classes ou funções de membro de classe de uma DLL usando a palavra-chave __declspec(dllexport). __declspec(dllexport) adiciona a política de exportação ao arquivo de objeto para que você não precise usar um arquivo .def.

Esta conveniência é mais aparente quando você tenta exportar nomes de função do C++ decoradas. Como não há nenhuma especificação padrão para a decoração de nome, o nome de uma função exportada pode alterar entre versões do compilador. Caso você use __declspec(dllexport), a recompilação da DLL e dos arquivos .exe dependentes é necessária apenas para levar em conta todas as alterações na convenção de nomenclatura.

Muitas diretivas de exportação, como ordinais, NONAME e PRIVATE, podem ser feitas somente em um arquivo de .def, e não há nenhuma maneira de especificar esses atributos sem um arquivo de .def. No entanto, usar __declspec(dllexport), além de um arquivo .def, não causa erros de compilação.

Para exportar funções, a palavra-chave __declspec(dllexport) deve aparecer à esquerda da palavra-chave chamada de convenção, se uma palavra-chave for especificada. Por exemplo:

__declspec(dllexport) void __cdecl Function1(void);

Para exportar todos os membros de dados e funções de membro públicos em uma classe, a palavra-chave deverá aparecer à esquerda do nome da classe, como a seguir:

class __declspec(dllexport) CExampleExport : public CObject
{ ... class definition ... };

Dica

__declspec(dllexport) não pode ser aplicado a uma função com a convenção de chamada __clrcall.

Para compilar a DLL, você normalmente cria um arquivo de cabeçalho que contém os protótipos e/ou as classes da função que você está exportando e adiciona __declspec(dllexport) às declarações no arquivo de cabeçalho. Para tornar seu código mais legível, defina uma macro para __declspec(dllexport) e use a macro com todos os símbolos que você estiver exportando:

#define DllExport   __declspec( dllexport ) 

__declspec(dllexport) armazena nomes de função na tabela de exportação da DLL. Se você deseja otimizar o tamanho da tabela, consulte Exportar funções de uma DLL por ordinal em vez de por nome.

Dica

Ao mover o código-fonte da DLL do Win16 para Win32, substitua todas as instâncias de __export por __declspec(dllexport).

Como uma referência, pesquise pelo arquivo de cabeçalho Winbase.h do Win32. Contém exemplos de uso de __declspec(dllimport).

O que você deseja fazer?

Que você deseja saber mais?

Consulte também

Conceitos

Exportando a partir de uma DLL