DLLs são bibliotecas de vinculação dinâmicas (Dynamic Link Libraries) que possibilitam o compartilhamento de funções ou procedimentos entre diferentes softwares. Uma vantagem que se tem ao utilizar DLLs é que, mesmo sendo utilizado por vários softwares, ela será carregada um única vez na memória do computador e quando a alteração ou substituição de versão da DLL, não será necessária uma compilação dos softwares que à utilizam.
Então, por que utilizar?
- Pense nos vários softwares que você já desenvolveu e que precisaram utilizar as mesmas funções.
- Quando alterava uma função era necessário acertar em todos softwares.
- Onde estão sua funções? No formulário principal?
- Multi linguagem. Posso utilizar DLLs criadas em qualquer linguagem, assim como qualquer linguagem pode utilizar uma DLL desenvolvida em Delphi (seguindo todos os padrões Windows).
Então, antes de encher o formulário principal de sua aplicação com funções para todo o aplicativo pense seriamente em criar uma DLL para armazená-las. Mas, para criar ou utilizar uma DLL precisamos concordar com as convenções de chamadas, com os tipos de parâmetros e outros detalhes que veremos a seguir.
Toda função ou procedimento de uma DLL deve seguir estas diretrizes:
- Estar listada na cláusula exports da DLL. Através disso a rotina pode ser acessada externamente.
- As funções exportadas devem conter a instrução stdcall ao final de sua declaração. Isso possibilita a passagem de parâmetros padrão do Win32.
- Os tipos de parâmetros devem ser os tipos padrões do Windows (a maioria compatível com o C).
- As DLLs criadas no Delphi devem capturar todas as possíveis exceções em sua execução. Isso quer dizer que temos que tratar exceções em todo bloco.
Para colocarmos a mão na massa, criaremos um DLL que terá uma função para calcular o ICMS de um produto. Abra o Delphi 7 e acesse o menu File | New | Other e escolha DLL Wizard. Antes do begin codifique a função:
function icms(valor, aliquota: Double): Double;
begin
try
Result:=(valor*aliquota)/100;
except
Result:=0;
end;
end;
E abaixo da função é necessário exportar a mesma:
exports
icms;/
Agora compile pressionando CTRL+F9. Pronto a DLL já deve ter estar criada no mesmo diretório que você salvou o projeto. Então passamos para a utilização dessa DLL. Crie uma nova aplicação através do menu File | New | Application. Adicione e configure os componentes conforme tabela:
Componente | Name | Caption | Text |
---|---|---|---|
Label1 | lblValor | Valor | |
Label2 | lblAliquota | Aliquota | |
Label3 | lblIcms | ICMS | |
Edit1 | edtValor | Apagado | |
Edit2 | edtAliquota | Apagado | |
Edit3 | edtIcms | Apagado | |
Button1 | btnCalcular | Calcular |
Obs: Apagado significa deixar a propriedade Text em branco (sem nada).
Ao final da configuração a aparência deve ser assim:
Agora clique duas vezes no botão calcular e coloque o seguinte código:
var
resultado: Double;
begin
//A variável resultado recebe o retorno da função contida na DLL
Resultado := icms(StrToFloat(edtValor.Text),
StrToFloat(edtAliquota.Text));
edtIcms.Text := Format('%8.2m', [resultado]);
end;
Para funcionar ainda é necessário fazer a declaração que indique que a função icms está contida na DLL funções.dll. Então, abaixo da cláusula implementation declare:
function icms(valor, aliquota:Double): Double; stdcall; external 'funcoes.dll';
Também é necessário copiar a DLL funcoes.dll para o mesmo diretório do software. Pronto, agora compile e teste.