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?
Exportar funções de C++ para uso em executáveis de linguagem C
Exportar funções de C para uso em executáveis de linguagem C ou C++