Exportando a partir de uma DLL usando __declspec(dllexport)
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 diretiva de exportação ao arquivo de objeto para que você não precise usar um arquivo .def.
Essa conveniência é mais evidente ao tentar exportar nomes de função C++ decorados. Como não há especificação padrão para decoração de nome, o nome de uma função exportada pode mudar entre versões do compilador. Se você usar __declspec(dllexport)
, recompilar a DLL e os arquivos .exe dependentes será necessário apenas para explicar as alterações de convenção de nomenclatura.
Muitas diretivas de exportação, como ordinals, NONAME e PRIVATE, só podem ser feitas em um arquivo .def e não há como especificar esses atributos sem um arquivo .def. No entanto, usar __declspec(dllexport)
além de usar um arquivo .def não causa erros de build.
Para exportar funções, a palavra-chave __declspec(dllexport)
deve aparecer à esquerda da palavra-chave da convenção de chamada, se uma palavra-chave for especificada. Por exemplo:
__declspec(dllexport) void __cdecl Function1(void);
Para exportar todos os membros de dados públicos e funções de membro em uma classe, a palavra-chave deve aparecer à esquerda do nome da classe da seguinte maneira:
class __declspec(dllexport) CExampleExport : public CObject
{ ... class definition ... };
Observação
__declspec(dllexport)
não pode ser aplicado a uma função com a convenção de chamada __clrcall
.
Ao criar a DLL, você normalmente cria um arquivo de cabeçalho com os protótipos de função e/ou classes que 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 com cada símbolo que estiver exportando:
#define DllExport __declspec( dllexport )
__declspec(dllexport)
armazena nomes de função na tabela de exportação da DLL. Para otimizar o tamanho da tabela, confira Exportando funções de uma DLL por ordinal e não por nome.
O que você deseja fazer?
Exportar funções do C++ para usar em executáveis da linguagem C
Exportar funções do C para usar em executáveis da linguagem C ou C++