Determinar qual método de exportação usar
É possível exportar funções de duas maneiras: um arquivo .def ou a palavra-chave __declspec(dllexport)
. Para ajudar você a decidir qual caminho será melhor para a DLL, considere estas perguntas:
Você planeja exportar mais funções posteriormente?
A DLL é usada apenas por aplicativos que você poderá recompilar ou é usada por aplicativos que você não poderá recompilar, por exemplo, aplicativos criados por terceiros?
Prós e contras de usar arquivos .def
Exportar funções em um arquivo .def oferece o controle sobre os ordinais de exportação. Ao adicionar uma função exportada à DLL, você poderá atribuir a ela um valor ordinal maior do que qualquer outra função exportada. Ao fazer isso, os aplicativos que usam vinculação implícita não precisarão vincular novamente a biblioteca de importação contendo a nova função. Isso será muito conveniente se você estiver projetando uma DLL para ser usada por muitos aplicativos, já que será possível adicionar novas funcionalidades e garantir que continuará funcionando corretamente com os aplicativos que já dependem dela. Por exemplo, as DLLs do MFC são compiladas usando arquivos .def.
Outra vantagem de usar um arquivo .def é que você pode usar o atributo NONAME
para exportar uma função. Isso coloca apenas o ordinal na tabela de exportações na DLL. Para DLLs que possuem um grande número de funções exportadas, o uso do atributo NONAME
poderá reduzir o tamanho do arquivo DLL. Para obter mais informações sobre como gravar uma instrução de definição de módulo, consulte Regras para declarações de definição de módulo. Para obter mais informações sobre exportação ordinal, consulte Exportar funções de uma DLL por ordinal em vez de por nome.
Uma desvantagem de usar um arquivo .def é que se você estiver exportando funções em um arquivo C++, será necessário colocar os nomes decorados no arquivo .def ou definir as funções exportadas usando o extern do "C" para evitar a decoração de nome feita pelo compilador MSVC.
Se você colocar os nomes decorados no arquivo .def, poderá obtê-los usando a ferramenta DUMPBIN ou usando a opção /MAP do vinculador. Os nomes decorados produzidos pelo compilador são específicos do compilador; portanto, se você colocar os nomes decorados produzidos pelo compilador em um arquivo .def, os aplicativos vinculados à DLL também deverão ser compilados usando a mesma versão do compilador para que os nomes decorados no aplicativo de chamada correspondam aos nomes exportados no arquivo .def da DLL.
Prós e contras de usar __declspec(dllexport)
Usar __declspec(dllexport)
é conveniente porque você não precisará se preocupar em manter um arquivo .def e obter os nomes decorados das funções exportadas. No entanto, a utilidade dessa forma de exportação é limitada pelo número de aplicativos vinculados que você deseja recompilar. Se você recompilar a DLL com novas exportações, também será necessário recompilar os aplicativos porque os nomes decorados para as funções em C++ exportadas poderão ser alterados se você usar uma versão diferente do compilador para recompilar.
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++