Artigo: 132044 - Última revisão: terça-feira, 2 de Dezembro de 2003 - Revisão: 2.0 INFO: Utilizando _declspec(dllimport) & _declspec(dllexport) no código
Nesta páginaSumárioEste artigo complementa as informações abrangidas no seguinte artigo na base de dados de conhecimento da Microsoft: 107501
(http://support.microsoft.com/kb/107501/EN-US/
)
INFO: __export substituídos por __declspec no Visual C++ 32 bits Este artigo explica as vantagens e mechanics da utilização _declspec(dllimport) e _declspec(dllexport) na aplicação. Mais InformaçãoA edição de 32 bits do Visual C++ utiliza _declspec(dllimport) e _declspec(dllexport) para substituir a palavra-chave __export utilizada anteriormente em versões de 16 bits do Visual C++. Não é necessário utilizar _declspec(dllimport) para o código para compilar correctamente, mas ao fazê-lo, permite o compilador ao gerar código melhor. O compilador é capaz de gerar código melhor uma vez que este tome conhecimento por tem a certeza se existe uma função de uma DLL ou não, para que o compilador pode produzir códigos ignorar um nível de direccionamento indirecto habitualmente estar presente na chamada de função que cruzado um limite DLL. Com a secção EXPORTS de ficheiro da .def adequada, não é necessário _declspec(dllexport). _declspec(dllexport) foi adicionada para proporcionar uma forma fácil exportar funções de um .exe ou .dll sem utilizar um ficheiro .def. Este artigo fornece uma discussão exaustiva, relativamente baixo nível sobre estes problemas. O formato executável portátil Win32 foi concebido para minimizar o número de páginas que devem ser processadas para corrigir importações. Para efectuar este procedimento, coloca todos os endereços importação para qualquer programa num único local denominado tabela de endereços importar. Isto permite que o carregador modificar apenas uma ou duas páginas ao aceder a estes importações. Utilizar _declspec(dllimport) para chamadas a funçõesNo seguinte exemplo de código, assumem func1 é uma função que reside em separado do ficheiro .exe que contém a função main() uma DLL.Sem _declspec(dllimport), atribuído este código: 0x40000000: jmp DWORD PTR __imp_func1 Assim, utilizar _declspec(dllimport) é melhor porque é melhor se o linker não gera uma thunk se não tiver a. Thunks aumentar o código (em sistemas em RISC, pode ser várias instruções) e pode degradar o desempenho da cache. Se saber o compilador que a função é de uma DLL, pode gerar uma chamada indirecta onde. Agora, este código: Por outro lado, para chamadas de função dentro de uma DLL, que não pretende ter de utilizar uma chamada indirecta. Já sabe o endereço de uma função. Tempo e espaço são necessários para carregar e armazenar o endereço da função antes de uma chamada indirecta, para que uma chamada directa é sempre mais rápido e mais pequeno. Só deseja utilizar __declspec(dllimport) ao chamar funções DLL do exterior a DLL propriamente dito. Não utilize __declspec(dllimport) funções dentro de uma DLL durante a criação dessa DLL. Utilizar _declspec(dllexport)A Microsoft apresentou __export na versão do compilador de 16 bits para permitir que o compilador gerar automaticamente os nomes de exportação e colocá-los num ficheiro .LIB. Este ficheiro .LIB, em seguida, poderia ser utilizado tal como um .LIB estática para ligar a uma DLL.A Microsoft adicionou __declspec(dllexport) para continuar esta conveniência. O objectivo consiste em Adicionar a directiva de exportação para o objecto ficheiro pelo que não necessita de um ficheiro .def. Esta questão de conveniência é mais evidente quando tentar exportar decorado os nomes das funções do C++. Não existe nenhuma especificação padrão para decoração de nomes, para pode alterar o nome de uma função exportada entre versões do compilador. Se utilizar _declspec(dllexport), recompilar o DLL e os ficheiros .exe dependentes é necessária apenas a conta para alterações de convenção de nomenclatura. Muitos exportar directivas como ordinais, NONAME ou PRIVATE, pode ser efectuada apenas num ficheiro .def e não é possível especificar estes atributos sem um ficheiro .def. No entanto, utilizar _declspec(dllexport) juntamente com a utilizar um ficheiro .def não causa erros de compilação. Como referência, procure o ficheiro de cabeçalho WINBASE.H Win32. Contém exemplos de utilização __declspec(dllexport) e __declspec(dllimport) preferencial. Utilizar _declspec(dllexport) e _declspec(dllimport) no dadosNo caso de dados, utilizar _declspec(dllimport) é um item de conveniência que remove uma camada de direccionamento indirecto. Quando importa dados de uma DLL, ainda tem de percorrer a tabela de endereços de importação. Nos dias Win32 antes _declspec(dllimport), isso significava tiver de se lembrar de efectuar um nível adicional de direccionamento indirecto quando aceder a dados exportados a partir da DLL:Para exportar os dados automaticamente a partir da DLL, utilize esta declaração: Utilizar um ficheiro .defSe optar por utilizar __declspec(dllimport) juntamente com um ficheiro .def, deve alterar o ficheiro .def para utilizar dados em vez da CONSTANTE para reduzir a probabilidade de que a codificação incorrecta causará um problema:
Keyword Emits in the import lib Exports
CONSTANT __imp_ulDataInDll ulDataInDll
__ulDataInDll
DATA __imp_ulDataInDll ulDataInDll
Se utilizar CONSTANTE, uma das seguintes construções de código pode ser utilizada para aceder a ulDataInDll: - ou - Linker actual Visual C++ emite um aviso se vê-lo CONSTANTE no ficheiro .def para contas para este incidente. O motivo real apenas para utilizar a CONSTANTE é se não conseguir recompilar alguns ficheiros de objecto onde o ficheiro de cabeçalho não lista dllimport no protótipo. ReferênciasO Visual C++ Books Online fornecem uma quantidade substancial de documentação na dllexport e dllimport atributos de classe de armazenamento. Isto inclui "Os atributos dllexport e dllimport" e os tópicos "utilizar dllimport e dllexport em C++" no capítulo "Microsoft específicas Modificadores" de referência de linguagem do C++ e os tópicos "Exportar símbolos" no capítulo "Criar DLLs de Win32" da referência técnicas de programação. Para uma lista exaustiva Tópicos relacionados, procure o Books Online para "dllimport" ou "dllexport". Para mais informações, consulte os seguintes artigos na base de dados de conhecimento da Microsoft: 90530
(http://support.microsoft.com/kb/90530/EN-US/
)
Como exportar dados a partir de uma DLL ou uma aplicação 107501
(http://support.microsoft.com/kb/107501/EN-US/
)
INFO: __export substituídos por __declspec no Visual C++ 32 bits A informação contida neste artigo aplica-se a:
Tradução automáticaIMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado. Clique aqui para ver a versão em Inglês deste artigo: 132044
(http://support.microsoft.com/kb/132044/en-us/
)
| Outros Recursos Outros Sites de Suporte
ComunidadesTraduções de Artigos |






Windows Live
Facebook
Twitter
Linkedin
Digg it
Yahoo
Delicious
StumbleUpon
Yammer
Reddit
Technorati
FriendFeed
Email



Voltar ao topo