terça-feira, 19 de julho de 2011

Criação de DLL - Dynamic Link Libraries


Vou explicar em breves palavras como criar um sistema com a utilização de arquivos dll’s.
1º Regras para escrever uma DLL no Delphi : As funções e/ou procedimentos de DLL devem seguir estas regras:
- Precisam estar listados na cláusula exports da DLL. Isso possibilita que no momento de chamar a funções e/ou procedimentos, seja aceito pelo programa principal.
- As funções exportadas precisam ser declaradas como stdcall;
- Os tipos de parâmetros de uma DLL devem ser de tipos padrão do Windows, pelo menos se você quiser usar a DLL dentro de outros ambientes de desenvolvimento, como por exemplo, C++.
- Uma DLL pode usar dados globais que não serão compartilhadas pelos programas base. Sempre que uma aplicação carrega uma DLL, ele armazena os dados globais da DLL em seu próprio espaço de endereço
 
2º Neste passo vamos tirar a dúvida a uma pergunta muita frequente; “Como criar uma DLL?”.
Dando início ao desenvolvimento de DLLs no Delphi, vou mostrar a vocês uma biblioteca muito simples. O principal objetivo desse exemplo é mostrar a sintaxe utilizada para definir uma DLL no Delphi.
Para começar, selecione o comando File/New, escolha a opção DLL na página New do Object Repository. Isso cria um Codigo-Fonte muito simples.
Aqui está código fonte da nossa primeira DLL:
 
Library MINHADLL.DLL;
uses SysUtils,
Classes;
{$R *.res}
function Triple(N: Integer): Integer; stdcall;
begin
  Result := N * 3;
end;
function Double (N: Integer): Integer; stdcall;
begin Result := N * 2;
end;
exports Triple, Double;
end.

3ª E agora por fim vamos incluir a dll num projecto Win32.

Para fazer um formulário usando nossa DLL vamos abrir o Delphi e criar uma nova aplicação.
Colocar dois Edits e dois Buttons, no evento OnClick dos botões faremos as chamadas das funções. Para chamar um função de uma DLL é preciso apenas declarar as funções de forma igual a declarada na dll, ou seja, nome, parâmetros e tipos.
Aqui fica um exemplo:

unit Unit1;
  interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
  type TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
  procedure Button1Click(Sender: TObject);
  procedure Button2Click(Sender: TObject);
  private { Private declarations }
  public { Public declarations }
end;
var Form1: TForm1;
implementation
{$R *.dfm}
 
{funções da DLL Delphi}
  function Double (N: Integer): Integer; stdcall; external 'MINHADLL.DLL';
  function Triple (N: Integer): Integer; stdcall; external 'MINHADLL.DLL';
  procedure TForm1.Button1Click(Sender: TObject);
  var x, y: integer;
  begin
    x := StrToInt(Edit1.Text);
    y := Double(x);
    Edit1.Text := IntToStr(y);
  end;
 
  procedure TForm1.Button2Click(Sender: TObject);
  var x, y: integer;
  begin
    x := StrToInt(Edit2.Text);
    y := Triple(x);
    Edit2.Text := IntToStr(y);
  end;
end.