Buscar

Criando dlls no delphi

Código

Delphi e DLLs
Como produzir e utilizar DLLs em seus aplicativos Delphi


 
Normalmente um programador possui várias funções que são utilizadas em vários aplicativos. Qual o melhor lugar para armazená-los? E como posso fazer uso de rotinas que a linguagem de programação que utilizo não permite (como no Visual Basic)?

A solução para esses problemas é o uso de DLLs (Dinamic Link Libraries). Um DLL é um programa que permite que vários programas possam acessar as mesmas funções, independentemente de linguagem.

Criando DLLs:

Primeiramente vá em File|New... e escolha DLL. Surgirá na tela um “esqueleto” de um programa DLL:

library Project1;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  View-Project Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the DELPHIMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using DELPHIMM.DLL, pass string information
  using PChar or ShortString parameters. }


uses
  SysUtils,
  Classes;

begin
end.

Para que uma procedure ou função possam ser utilizados, é necessário informar que eles podem ser exportados (utilizados por outros aplicativos), colocando-se as diretivas stdcall; export; após sua declaração. No final do programa (antes do begin - end. ), deve-se informar as rotinas a serem exportadas e seus respectivos índices (pode ser qualquer um, desde que seja único em todo o DLL). Caso não seja informado não poderá ser utilizado por outros programas.

Um exemplo completo de criação de DLL:


library Exemplo;

uses
  SysUtils,
  Classes;

function AreaQuadrado (Lado : Integer) : Integer; stdcall; export;
begin
  Result := Lado * Lado;
end;

function AreaTrapezio (lMaior, lMenor, Altura : Integer) : Extended; stdcall; export;
begin
  Result := ((lMaior + lMenor) * Altura) / 2;
end;

function AreaCirculo (Raio : Integer) : Extended; stdcall; export;
begin
  Result := 3.14159 * Raio;
end;

exports
  AreaQuadrado index 1,
  AreaTrapezio index 2,
  AreaCirculo index 3;

begin
end.

Utilizando DLLs em Aplicativos Delphi

Há dois métodos de colocar um DLL em um programa: o método estático e o dinâmico. A diferença entre eles é que no primeiro caso, o DLL é carregado com o programa, e não roda sem ele. Ou seja, caso o DLL não esteja no diretório do programa ou no diretório do Windows, o programa não executa. No segundo método, o DLL é executado durante a execução do programa, e pode ser liberado da memória logo após a execução. Usar o melhor método é uma questão de escolha.

Método Estático:

implementation

function AreaQuadrado(Lado : Integer) : Integer; external ‘exemplo.dll’ index 1;

A declaração de uma função ou procedure externa é praticamente idêntica à declaração de uma função “comum”, as únicas diferenças são:

•       Não é necessário incluir a declaração na seção interface, somente na implementation;
•       Não é necessário colocar begin - end na função, simplesmente declará-la é suficiente.





Método Dinâmico:
interface

type
  AreaQuadrado = function (Lado : Integer) : Integer;

implementation

procedure TfrmMain.btAreaClick (Sender : Tobject);
var
  Area : Integer;
  Handle : THandle;
begin
  Handle := LoadLibrary (‘exemplo.dll);
  if Handle <> 0 then
    begin
      @AreaQuadrado := GetProcAddress (Handle, ‘AreaQuadrado’);
      if @AreaQuadrado <> nil then
        begin
          Area := AreaQuadrado (strtoint (edArea.Text));
            ShowMessage (‘A área do quadrado é de ‘ + inttostr (Area) + ‘m²‘);
          end;
      FreeLibrary (Handle);
  end;
end;

Observações sobre DLLs:

•       Nunca faça acesso a dados confidenciais em DLLs (como esquemas de senha), mesmo que precise ser usado em várias linguagens. É mais fácil, porém menos seguro (pode ser que algum cracker - usar hacker como pirata de computador é um erro - descubra o índice do DLL e faça uso indevido do programa);
•       Tome cuidado com o tipo String. O Delphi implementa o uso de strings longas, mas pode ser que outras linguagens não a implementem. Portanto é recomendável o uso de ShortString ou PChar como tipo de retorno em funções e em parâmetros de Strings;
•       Sempre trate qualquer tipo de erro a partir do DLL: caso ela não seja tratada, o erro vai “vazar” para o programa, e o resultado é impossível de se dizer com precisão;
•       Lembre-se de sempre remover os DLLs da memória (quando for fazer acessos dinâmicos);
•       Nunca se esqueça de colocar o seu DLL em um dos seguintes diretórios: o diretório do programa, o diretório do Windows (normalmente C:Windows), o diretório de sistema do Windows (normalmente C:WindowsSystem) ou qualquer diretório que esteja na cláusula “PATH” do arquivo AutoExec.Bat.
 

Publicidade

Vote na dica




Quantidade de votos: 0 votos
Aceitação: 0%


Detalhes da dica

Categoria: Arquivos
Adicionada dia: 04/11/04
Por: Alex Di Gregório
Visualizada: 22236 vezes

Planeta Delphi - Tudo sobre programação Delphi Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009