Partilhar via


Determinar qual método de exportação usar

Você pode exportar funções de duas maneiras: um arquivo .def ou a __declspec(dllexport) palavra-chave. Para ajudá-lo a decidir qual caminho é melhor para sua DLL, considere estas perguntas:

  • Planeia exportar mais funções mais tarde?

  • Sua DLL é usada apenas por aplicativos que você pode reconstruir ou é usada por aplicativos que você não pode reconstruir — por exemplo, aplicativos que são criados por terceiros?

Prós e contras do uso de arquivos .def

A exportação de funções em um arquivo .def oferece controle sobre os ordinais de exportação. Quando você adiciona uma função exportada à sua DLL, você pode atribuir-lhe um valor ordinal mais alto do que qualquer outra função exportada. Quando você fizer isso, os aplicativos que usam vinculação implícita não precisam revincular com a biblioteca de importação que contém a nova função. Isso é muito conveniente se você estiver projetando uma DLL para uso por muitos aplicativos, porque você pode adicionar novas funcionalidades e também garantir que ele continue a funcionar corretamente com os aplicativos que já dependem dele. Por exemplo, as DLLs MFC são criadas usando arquivos .def.

Outra vantagem de usar um arquivo .def é que você pode usar o NONAME atributo para exportar uma função. Isso coloca somente o ordinal na tabela de exportações na DLL. Para DLLs que têm um grande número de funções exportadas, usando o NONAME atributo pode reduzir o tamanho do arquivo DLL. Para obter informações sobre como escrever uma instrução de definição de módulo, consulte Regras para instruções Module-Definition. Para obter informações sobre exportação ordinal, consulte Exportando 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++, terá que colocar os nomes decorados no arquivo .def ou definir as funções exportadas usando "C" externo para evitar a decoração de nomes feita pelo compilador Microsoft C++ (MSVC).

Se você colocar os nomes decorados no arquivo .def, poderá obtê-los usando a ferramenta DUMPBIN ou a opção linker /MAP . Os nomes decorados que são produzidos pelo compilador são específicos do compilador; portanto, se você colocar os nomes decorados que são produzidos pelo compilador em um arquivo .def, os aplicativos que se vinculam à DLL também devem ser criados 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 do uso de __declspec(dllexport)

Usar __declspec(dllexport) é conveniente porque você não precisa se preocupar em manter um arquivo .def e obter os nomes decorados das funções exportadas. No entanto, a utilidade dessa maneira de exportar é limitada pelo número de aplicativos vinculados que você está disposto a reconstruir. Ao reconstruir a DLL com novas exportações, também terá de reconstruir as aplicações, pois os nomes decorados para funções exportadas em C++ podem alterar-se se utilizar uma versão diferente do compilador para a reconstruir.

O que pretende fazer?

Sobre o que quer saber mais?

Ver também

Exportando de uma DLL