A biblioteca de vínculo dinâmico ou DLL, permite que um aplicativo para carregar apenas o código executável mínimo necessário para a memória em tempo de execução . Sempre que o programa chama uma função em uma DLL , o sistema operacional carrega a DLL na memória , de acordo com as especificações do programador . Enquanto o programa em execução não faz referência a uma função de DLL, essa DLL não precisa ocupar espaço. Isso economiza um monte de recursos e aumenta o desempenho em tempo de execução . Se a biblioteca eram estáticas , todo o código da biblioteca seria anexado ao código executável principal do programa eo programa gigante teria que ficar na memória para todo o tempo de execução. A versão do Unix ou Linux de uma DLL do Windows é uma biblioteca compartilhada , construída de acordo com a extensão ". Assim. " Windows , Unix e Linux têm convenções específicas para acessar as funções em DLLs ou bibliotecas compartilhadas . Exportação Windows DLL objetos usando dllexport Keyword
Para fazer uma função , classe, elemento de dados ou função membro da classe acessível para o programa de chamada Windows, você deve exportá-lo primeiro. Uma classe ou função pode ser exportado durante sua definição usando a palavra-chave " __declspec (dllexport) " antes da função , classe ou nome da variável, da seguinte forma:
void __ declspec ( dllexport) MyClass : CObjectName público { ..... }
No arquivo de cabeçalho DLL, colocar esta palavra-chave antes do nome da função em uma declaração protótipo. O " __declspec (dllexport) " palavra-chave armazena os nomes de função na tabela de exportação da DLL. Para economizar o espaço que ocupa esta tabela , utilize números ordinais em vez de nomes de função.
Export Windows DLL objetos através Module Definition
arquivos como uma alternativa para a palavra-chave " __declspec (dllexport) , " criar um arquivo de definição de módulo que indica o nome da biblioteca , descrição opcional e lista os nomes de funções , classes e variáveis de dados na DLL juntamente com valores ordinais opcionais. O valor ordinal de uma função varia de 1 a N em que N é o número de funções na DLL . O arquivo de definição de módulo tem a extensão ". . DEF " A seguir é um exemplo de um arquivo de definição de módulo, ou um arquivo DEF : .
BIBLIOTECA ReportWriterDESCRIPTION Esta biblioteca contém a funcionalidade dinâmico gerador de relatórios de MyProduct.RPT_setup @ 1RPT_design @ @ 2RPT_run 3RPT_print @ 4
Se você criar uma Fundação DLL Classe Microsoft usando AppWizard do Visual Studio , o assistente irá gerar um esqueleto. def para a DLL e adicioná-lo ao projeto. Adicionar entradas para funções DLL no presente. Def para exportá-los . O formato do protótipo da função utilizada pelo programa de chamada deve coincidir com o formato das entradas de função no arquivo DEF . . Ou usar definições simples em ambos os lugares , ou , definições gerados pelo compilador específico do compilador em ambos os lugares de forma consistente.
Importação e Exportação de extensão DLLs
A Microsoft Foundation Class extensão DLL normalmente consiste de classes reutilizáveis derivados de tipos de classes MFC existentes. Eles são construídos usando uma versão DLL do MFC, e pode ser chamado a partir de aplicativos e DLLs construídos usando esta versão compartilhada do MFC . Para exportar as classes em DLLs de extensão , use a macro " AFX_EXT_CLASS " antes do nome da classe como esta: Classe AFX_EXT_CLASS CMyViewClass : CView pública {//Classe corpo }; Se você estiver usando um arquivo DEF , adicione o seguinte código de macro no início . e no final do arquivo estendido cabeçalho DLL: # undef AFX_DATA # define AFX_DATA AFX_EXT_DATA //
estendida # undef AFX_DATA # define AFX_DATA
Estas directivas de pré-processamento certifique-se de que as variáveis do MFC e derivações e exportado da DLL estendida.
importando funções DLL
o outro lado da exportação de objetos a partir de DLLs é importá-los para aplicações usando o " __declspec (dllimport ) " palavra-chave.
Exportação C Funções para uso em C ou C + + executáveis
Se o programa de chamada ou função é escrito em C + , use o +" C externo " directiva de pré-processamento no cabeçalho DLL se as funções DLL são escritos em C.
Aqui está um exemplo ://MyDLLFunctions.h # ifdef __ cplusplusExtern "C" {# endif__declspec ( dllImport) MyFunc01 void ( ); __declspec (dllimport ) MyFunc02 void ( ) ; # ifdef __ suportes cplusplus } //fim para " extern C " diretiva # endif
Como uma alternativa para especificar a diretiva " extern C " dentro do cabeçalho DLL , você pode incluir o arquivo de cabeçalho DLL com um C " externo" " " wrapper condicionalmente , como segue:
# ifdef __ cplusplusExtern "C" { # endif
# include " DLLPath \\ MyDLLFunctions.h "
suportes
# ifdef __ cplusplus } //fim para " extern C " diretiva # endif