Uma DLL (Dynamic Link Library) atua como uma biblioteca compartilhada de funções que podem ser chamadas por vários aplicativos e outras DLLs. Delphi permite que você criar e usar DLLs para que você possa chamar essas funções à vontade. No entanto, você deve importar essas rotinas antes de poder chamá-las.
As funções exportadas de uma DLL podem ser importadas de duas maneiras - declarando uma função ou procedimento externo (estático) ou por chamadas diretas para funções de API específicas da DLL (dinâmicas).
Vamos considerar uma DLL simples. Abaixo está o código para "circle.dll" que exporta uma função, chamada "CircleArea", que calcula a área de um círculo usando o raio especificado:
Depois de ter o circle.dll, você pode usar a função "CircleArea" exportada do seu aplicativo.
Carregamento estático
A maneira mais simples de importar um procedimento ou função é declará-lo usando a diretiva externa:
Se você incluir esta declaração na parte da interface de uma unidade, o circle.dll será carregado uma vez quando o programa for iniciado. Durante a execução do programa, a função CircleArea está disponível para todas as unidades que usam a unidade onde está a declaração acima.
Carregamento Dinâmico
Você pode acessar rotinas em uma biblioteca através de chamadas diretas para APIs do Win32, incluindo LoadLibrary, FreeLibrarye GetProcAddress. Essas funções são declaradas no Windows.pas.
Veja como chamar a função CircleArea usando carregamento dinâmico:
Ao importar usando carregamento dinâmico, a DLL não é carregada até a chamada para LoadLibrary. A biblioteca é descarregada pelo ligue para FreeLibrary.
Com o carregamento estático, a DLL é carregada e suas seções de inicialização são executadas antes da execução das seções de inicialização do aplicativo de chamada. Isso é revertido com carregamento dinâmico.
Você deve usar estático ou dinâmico?
Aqui está uma olhada simples nas vantagens e desvantagens do carregamento de DLL estático e dinâmico:
Carregamento estático
Prós:
- Mais fácil para um desenvolvedor iniciante; não "feio" Chamadas de API.
- As DLLs são carregadas apenas uma vez, quando o programa é iniciado.
Contras:
- O aplicativo não será iniciado se alguma DLL estiver ausente ou não puder ser encontrada. Uma mensagem de erro como esta aparecerá: "Esta aplicação falhou ao iniciar porque 'missing.dll' não foi encontrado. Reinstalar o aplicativo pode corrigir esse problema ". Por design, a ordem de pesquisa de DLL com vinculação estática inclui o diretório no qual o aplicativo carregado, o diretório do sistema, o diretório do Windows e os diretórios listados no ambiente PATH variável. Observe também que a ordem de pesquisa pode ser diferente para várias versões do Windows. Sempre espere ter todas as DLLs no diretório em que está o aplicativo de chamada.
- Mais memória é usada, pois todas as DLLs são carregadas, mesmo que você não use algumas das funções.
Carregamento Dinâmico
Prós:
- Você pode executar seu programa mesmo quando algumas das bibliotecas usadas não estiverem presentes.
- Menor consumo de memória, pois as DLLs são usadas somente quando necessário.
- Você pode especificar o caminho completo para a DLL.
- Pode ser usado para aplicações modulares. O aplicativo expõe apenas (carrega) módulos (DLLs) "aprovados" para o usuário.
- A capacidade de carregar e descarregar dinamicamente a biblioteca é a base de um sistema de plug-in que permite que um desenvolvedor adicione funcionalidade extra aos programas.
- Compatibilidade com versões anteriores com versões mais antigas do Windows nas quais as DLLs do sistema podem não suportar as mesmas funções ou podem ser suportadas da mesma maneira. Detectar a versão do Windows primeiro e, em seguida, vincular dinamicamente com base no aplicativo em execução, permite oferecer suporte a mais versões do Windows e fornece soluções alternativas para sistemas operacionais mais antigos (ou, no mínimo, recursos que desabilitam normalmente que você não pode Apoio, suporte.)
Contras:
- Requer mais código, o que nem sempre é fácil para um desenvolvedor iniciante.