Qual é a diferença entre dllexport e dllimport?
-
09-06-2019 - |
Pergunta
Estou apenas procurando uma explicação simples e concisa da diferença entre os dois.O MSDN não entra em muitos detalhes aqui.
Solução
__declspec(dllexport)
informa ao vinculador que você deseja que esse objeto seja disponibilizado para importação de outras DLLs.Ele é usado ao criar uma DLL à qual outras pessoas podem vincular.__declspec(dllimport)
importa a implementação de uma DLL para que seu aplicativo possa usá-la.
Sou apenas um desenvolvedor C/C++ novato, então talvez alguém tenha uma explicação melhor do que eu.
Outras dicas
__declspec( dllexport )
- A classe ou função marcada será exportada da DLL em que está incorporada.Se você estiver criando uma DLL e quiser uma API, precisará usar esta ou um arquivo .DEF separado que defina as exportações (MSDN).Isso é útil porque mantém a definição em um só lugar, mas o arquivo .DEF oferece mais opções.
__declspec( dllimport )
- A classe ou função assim marcada será importada de uma DLL.Na verdade, isso não é necessário - você precisa de uma biblioteca de importação de qualquer forma para deixar o vinculador feliz.Mas quando devidamente marcado com dllimport
, o compilador e o vinculador possuem informações suficientes para otimizar a chamada;sem ele, você obtém links estáticos normais para uma função stub na biblioteca de importação, o que adiciona indireção desnecessária. ONT1 ONT2
Dois casos de uso diferentes:
1) Você está definindo uma implementação de classe dentro de uma dll.Você quer que outro programa use a classe.Aqui você usa dllexport ao criar uma classe que deseja que a dll exponha.
2) Você está usando uma função fornecida por uma dll.Você inclui um cabeçalho fornecido com a dll.Aqui o cabeçalho usa dllimport para trazer a implementação a ser usada pelo programa atual.
Freqüentemente, o mesmo arquivo de cabeçalho é usado em ambos os casos e uma macro é definida.A configuração de construção define a macro a ser importada ou exportada dependendo do que for necessário.
Dllexport é usado para marcar uma função como exportada.Você implementa a função em sua DLL e a exporta para que fique disponível para qualquer pessoa que use sua DLL.
Dllimport é o oposto:marca uma função como importada de uma DLL.Neste caso você apenas declara a assinatura da função e vincula seu código à biblioteca.