Criação de DLLs

Esta é uma outra dúvida bastante freqüente que chega a nós. "Como posso
usar uma DLL ?", "Como posso criar uma DLL ?", "Ei, moço! Pra quê serve
uma DLL ?"

Pois bem, DLL ou Dynamic Link Libraries, permitem que um conjunto de
funções desenvolvidas em uma linguagem possam ser utilizadas em
programas desenvolvidos em outras linguagens.

Você pode, por exemplo, criar uma DLL em Delphi com um conjunto de
funções e utilizá-la em aplicativos desenvolvidos em C++ ou Visual
Basic, por exemplo. Agora, vamos começar criando uma DLL:

   1.

      Selecione o item New do Menu File, para exibir a caixa de diálogo
      New Items. Agora, selecione o item DLL e clique em OK, para gerar
      o código principal da DLL, que se apresenta a seguir:


            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 Project-View 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
            BORLNDMM.DLL shared memory manager, which must be deployed
            along with your DLL. To avoid using BORLNDMM.DLL, pass
            string information using PChar or ShortString parameters. }


            uses


            SysUtils, Classes;


            begin


            end.

Em muitas situações, inclusive esta, o arquivo DELPHIMM.DLL deve ser
distribuído junto à sua aplicação. Uma outra observação muito
importante, para que você possa escrever suas DLLs, você deve ter
conhecimentos na Linguagem Object Pascal.

Vamos continuar criando nossa DLL, pois é ela que iremos usar mais para
frente. Apenas como exemplificação, vamos criar uma função que receba
como parâmetros dois números reais e retorne o maior deles.


            Function Max (a b : double ) : double ; Export ; stdcall ;


            begin


            If (a > b) then Result :=a else Result := b ;


            end ;



Export = indica que a função poderá ser chamada por outros aplicativos.

Stdcall = permite que aplicativos desenvolvidos em outras linguagens
façam chamadas à função.

Após serem feitas estas alterações e salvar o projeto com o nome MAXDLL,
nossa DLL ficará assim:


            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 Project-View 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
            BORLNDMM.DLL shared memory manager, which must be deployed
            along with your DLL. To avoid using BORLNDMM.DLL, pass
            string information using PChar or ShortString parameters. }


             uses


            SysUtils,


            Classes;


            function Max(a, b : double):double:expert:stdcall:


            begin


            if (a > b) then result:= a else result := b;


            end;


             exports


            Max index 1;


            begin


            end.


Você pode compilar uma DLL, assim como a um projeto no Delphi, e
distribuir livremente.

PS: Você não pode executar uma DLL pelo Delphi, através do RUN do Menu
Run, pois não se trata de uma aplicação.

Mais à frente, você perceberá que uma DLL pode usar formulários e
objetos definidos em outras unidades. Iremos, agora, chamar uma DLL, a
partir de outra aplicação.

Neste exemplo que iremos montar, iremos usar: um formulário, duas caixas
de texto (os quais o usuário irá digitar dois números reais), um botão
de comando.


            unit usadll;


             interface


            uses


            Windows, Messages, SysUtils, Classes, Graphics, Controls,
            Forms, Dialogs, StdCtrls;


            type


            TForm1 = class(TForm)


            Label1: TLabel;


            Label2: TLabel;


            Button1: TButton;


            Edit1: TEdit;


            Edit2: TEdit;


            procedure Button1Click(Sender: TObject);


            private


            { Private declarations }


            public


            { Public declarations }


            end;


            function Max(a, b : double):double;stdcall;


            var


            Form1: TForm1;


            


            implementation


            {$R *.DFM}


            function Max(a, b : double):double;external 'MaxDLL';


            procedure TForm1.Button1Click(Sender: TObject);


            var


            x, y, resultado : double;


            begin


            x := StrToFloat(Edit1.Text);


            y := StrToFloat(Edit2.Text);


            resultado := Max(x,y);


            ShowMessage('Valor Máximo ' +FloatToStr(resultado));


            end;


            end.

PS: A função Max está declarada na seção interface e implementada na
seção implementation, ou seja, a função está implementada em uma DLL.

Bem, mostramos como criar uma DLL simples e como fazer chamada de uma
DLL. Agora, iremos melhorar nossa DLL, fazendo com que ela exiba um
formulário qualquer em qualquer aplicação desenvolvida para Windows.



Marcelo Alves de Souza escreveu:
> Será que ninguém pode me ajudar???
>
> Marcelo.
>
> -----Mensagem original-----
> De: delphi-br@yahoogrupos.com.br [mailto:[EMAIL PROTECTED] Em
> nome de Marcelo Alves de Souza
> Enviada em: segunda-feira, 22 de maio de 2006 12:26
> Para: delphi-br@yahoogrupos.com.br
> Assunto: [delphi-br] Criando DLL
>
> Pessoal,
>
> Preciso criar uma DLL que se conecta a uma base SQL Server e gere um
> Relatório em PDF.
>
> Eu sei como fazer tudo isso, esse não é o problema, o que está me faltando
> mesmo é um pouco de conhecimento referente a parte de DLL's mesmo.
>
> Seguinte:
>
> Criei o meu projeto DLL conforme abaixo:
>
> library minhadll;
>
> uses
>   SysUtils,
>   Classes,
>   uPrincipal in 'uPrincipal.pas' {frmPrincipal},
>   uRelatorio in 'uRelatorio.pas' {Rep: TQuickRep};
>
> {$R *.res}
>
> Procedure GeraPDF( Servidor, Tipo: String ); stdcall; begin
>      frmPrincipal.GeraRelatorio( Servidor, Tipo ); end;
>
> exports GeraPDF;
>
> end.
>
>
> Como vocês podem ver tenho duas Units no meu projeto. Uma é somente um
> form
> para eu colocar os componentes que necessito, no Caso o ADOConnection,
> ADOQuery e um outro que uso para exportar para PDF. A outra unit é um
> Report.
>
> Ao debugar bem na linha abaixo:
>
> frmPrincipal.GeraRelatorio( Servidor, Cliente, Tipo, Dir, DataIni, DataFim
> );
>
> recebo um erro de access violation. Como as minhas ações estão no form
> frmPrincipal e o erro acontece justamente ao chamar algo que está nele,
> percebi que estava faltando eu criar o form. Aí tentei de todos os
> jeitos e
> não consegui. O que está faltando eu declarar para que eu possa utilizar o
> form frmPrincipal.
>
> Para criar o frmPrincipal tentei um dos dois códigos abaixo:
>
> Forma 1:
>
> Application.CreateForm( TfrmPrincipal, frmPrincipal ) ;
>
> Forma 2:
>
>      If frmPrincipal = Nil Then frmPrincipal := TfrmPrincipal.Create(
> Self )
> ;
>
>
> Poderiam me ajudar????????
>
>
> Att,
>
> Marcelo A. Souza
>
>
>
> --
> <<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>>
>
>
>
> Links do Yahoo! Grupos
>
>
>
>
>
>
>
>
>
>
>
> --
> <<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>>
>
>
>
>
>
> *Yahoo! Grupos, um serviço oferecido por:*
> PUBLICIDADE
>
>
> ------------------------------------------------------------------------
> *Links do Yahoo! Grupos*
>
>     * Para visitar o site do seu grupo na web, acesse:
>       http://br.groups.yahoo.com/group/delphi-br/
>       
>     * Para sair deste grupo, envie um e-mail para:
>       [EMAIL PROTECTED]
>       <mailto:[EMAIL PROTECTED]>
>       
>     * O uso que você faz do Yahoo! Grupos está sujeito aos Termos do
>       Serviço do Yahoo! <http://br.yahoo.com/info/utos.html>.
>
>

--
*Fernando dos Santos Sousa*
*Hotforms Hosting & Webdesign*
Telefone* (12) 3011-0660 | *Celular* (12) 9147-6740*
Email [EMAIL PROTECTED]
<mailto:[EMAIL PROTECTED]>
WWW*http://www.hotforms.com.br*





--
<<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>>

<*> Para ver as mensagens antigas, acesse:
    http://br.groups.yahoo.com/group/delphi-br/messages

<*> Para falar com o moderador, envie um e-mail para:
    [EMAIL PROTECTED]



Yahoo! Grupos, um serviço oferecido por:
PUBLICIDADE


Links do Yahoo! Grupos

Responder a