como embutir uma dll no executável evitando sua distribuição separadamente

Upload: juninho-junior

Post on 05-Apr-2018

220 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/31/2019 Como embutir uma DLL no executvel evitando sua distribuio separadamente

    1/5

    Como embutir uma DLL no executvel evitando sua distribuioseparadamente

    porAdenilton Rodrigues

    Basicamente a tcnica consiste em transformar o arquivo DLL (pode ser qualquerarquivo: imagem, som, etc) em um arquivo de recursos e adicion-lo ao pacote doexecutvel (extenso .res). Quando houver a necessidade do seu uso, ele pode serextrado e salvo temporariamente (ou definitivamente).

    TRANSFORMANDO O ARQUIVO DLL em RES

    Neste pequeno roteiro irei demonstrar como incorporar o arquivo MIDAS.DLL aoseuarquivo EXE e sua extrao automtica quando o programa for executado.

    Primeiro precisamos transformar o arquivo MIDAS.DLL em um arquivo de recursos,

    o qual chamaremos de MIDAS.RES.

    1. V ao prompt do DOS e crie um arquivo qualquer no formato texto com aextenso .rc (para manter uma coerncia, chamarei-o de MIDAS.RC).

    Esse arquivo dever possuir uma linha para cada arquivo a ser transformadoem recurso. Nesse exemplo conter apenas uma linha, pois trabalhareiapenas com o MIDAS.DLL. Sua estrutura dever ser:

    MIDASDLL DLLFILE C:\WINDOWS\SYSTEM\MIDAS.DLL

    O primeiro parmetro o label a ser atribuido ao arquivo (Ser utilizado

    pelo delphi pra achar o recurso).

    O segundo apenas um identificador do tipo de arquivo.

    O terceiro o path onde o compilador de recursos ir buscar o arquivo paratransformar em .RES.

    2. Execute o compilador de recursos que acompanha o delphi: Est na pastaBIN e se chama BRCC32.EXE. Este um programa do DOS, portanto sevoc no estiver na pasta BIN do delphi, tenha a certeza que sua vriavelPATH esteja apontando para l. ( Se quiser configurar na mo digite no

    DOS:SET PATH=%PATH%;diretorio_delphi\bin)

    Para transformar o arquivo .RC em .RES digite:

    BRCC32 MIDAS.RC

    D um comando DIR e verifique a existncia do arquivo MIDAS.RES (Se noencontrar, revise os procedimentos).

    CRIANDO UM PROGRAMA QUE LEVA A DLL EMBUTIDA

    Veja agora como criar um programa que embute a DLL no seu executvel:

    mailto:[email protected]:[email protected]:[email protected]:[email protected]
  • 7/31/2019 Como embutir uma DLL no executvel evitando sua distribuio separadamente

    2/5

    1. Crie um projeto com um form e coloque um TButton.2. No cdigo fonte da Unit voc encontrar o seguinte include: {$R *.DFM}

    Logo abaixo dele inclua o seu arquivo de recurso da seguinte maneira:{$R MIDAS.RES}

    Ficar assim:

    {$R *.DFM}{$R MIDAS.RES}

    Obs: Voc pode colocar sua include em qualquer parte do programa (o linkero achar), contudo o ideal nesta seo para facilitar a localizao visualdos recursos utilizados pela sua aplicao.

    Nesse momento se voc compilar seu projeto, o arquivo MIDAS.DLL jestar incorporado ao executvel da aplicao.

    Veja como extrair a DLL em tempo de cdigo.

    Uma veja incorporado ao executvel um recurso, ser necessrio extrai-lo antes doseu uso (Depois mostrarei uma tcnica de autoextrao).

    O Delphi possui uma Classe que permite a manipulao de recursos, aTResourceStream. A rotina abaixo extrai o arquivo MIDAS.DLL e salva no diretorioda aplicao:

    Procedure SaveMidas;Var PathToSave : String;

    Res : TResourceStream;BeginPathToSave := ExtractFilePath(Application.ExeName)+'\MIDAS.DLL';If not FileExists(PathToSave) Then Begin

    Res := TResourceStream.Create(Hinstance, 'MIDASDLL', 'DLLFILE');TryRes.SavetoFile(PathToSave);

    FinallyRes.Free;

    End;End;

    End;

    Para execut-la, no OnClick do boto escreva: SaveMidas;

    Veja o cdigo completo:

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

    typeTForm1 = class(TForm)

    Button1: TButton;procedure Button1Click(Sender: TObject);

    private{ Private declarations }

  • 7/31/2019 Como embutir uma DLL no executvel evitando sua distribuio separadamente

    3/5

    public{ Public declarations }

    end;

    varForm1: TForm1;

    implementation{$R *.DFM}{$R MIDAS.RES}

    Procedure SaveMIDASDLL;Var PathToSave:String;

    Res : TResourceStream;BeginPathToSave := ExtractFilePath(Application.ExeName)+'\MIDAS.DLL';If not FileExists(PathToSave) Then Begin

    Res := TResourceStream.Create(Hinstance, 'MIDASDLL', 'DLLFILE');

    TryRes.SavetoFile(PathToSave);

    FinallyRes.Free;

    End;End;

    End;

    procedure TForm1.Button1Click(Sender: TObject);begin

    SaveMidasDLL;end;

    end.

    Se voc quiser salvar no diretrio System do Windows, a procedure abaixo facilitarsua vida:Function ExtractSystemDir : String;Var Buffer : Array[0..255] ofChar;BeginGetSystemDirectory(Buffer,144);Result := StrPas(Buffer);

    End;

    end.

    AUTO-EXTRAINDO A DLL

    Uma tcnica interessante a auto-extrao da DLL no momento da inicializao desua aplicao sem a necessidade da chamada explicita procedure SaveMidasDLL.Vamos utilizar o recurso de auto-inicializao das Units implementado pelo Delphi.

    Para quem no conhece, o Delphi quando carrega uma Unit ele executaautomaticamente o cdigo dentro do bloco INITIALIZATION antes mesmo daaplicao ser totalmente inicializada, um excelente gancho para se colocar rotinas

    de inicializao. O mais espertos j perceberam que o Bloco FINALIZATION faz omesmo efeito, porm ao finalizar a execuo da aplicao.

  • 7/31/2019 Como embutir uma DLL no executvel evitando sua distribuio separadamente

    4/5

    Para ver a auto-extrao, acrescente o bloco de cdigo abaixo ao final da Unit doForm:

    InitializationBeginShowMessage('Gerando o arquivo MIDAS.DLL');

    SaveMidasDLL;End;End.

    Veja que agora, quando o form criado (e a unit acionada), a procedureSaveMidasDLL executada automaticamente.

    PROBLEMAS

    Dependendo da forma como sua aplicao foi criada voc pode se deparar com um

    problema: Uma parte do cdigo pode estar chamando um arquivo que ainda no foiextraido (situao muito comum com aplicaes que chamam DLL's na suainicializao).

    Uma boa tcnica acrescentar o cdigo de extrao no arquivo .DPR, assim eleser acionado antes de qualquer outra rotina da aplicao.

    Eu particularmente prefiro outra tcnica: Colocar as rotinas de auto-extrao emuma unit exclusiva e cham-la primeiramente na minha aplicao, o cdigo ficamais limpo, e todas as vezes que voc precisar usar o recurso basta apenasacrescent-la sua clusula Uses.

    Veja o cdigo pronto:

    unit AutoMidas;

    interface

    Uses Windows, Classes, Sysutils, Forms,Dialogs;

    Function ExtractSystemDir : String;Procedure SaveMIDASDLL;

    implementation

    {$R MIDAS.RES}

    Procedure SaveMIDASDLL;Var PathToSave:String;

    Res : TResourceStream;BeginPathToSave := ExtractFilePath(Application.ExeName)+'\MIDAS.DLL';If not FileExists(PathToSave) Then Begin

    Res := TResourceStream.Create(Hinstance, 'MIDASDLL', 'DLLFILE');TryRes.SavetoFile(PathToSave);

    FinallyRes.Free;End;

  • 7/31/2019 Como embutir uma DLL no executvel evitando sua distribuio separadamente

    5/5

    End;End;

    Function ExtractSystemDir : String;Var Buffer : Array[0..255] ofChar;Begin

    GetSystemDirectory(Buffer,144);Result := StrPas(Buffer);

    End;

    InitializationBegin

    ShowMessage('Gerando o arquivo MIDAS.DLL');SaveMidasDLL;

    End;

    end.

    Importante: Para evitar o problema mencionado acima, onde a aplicao chama oarquivo antes de sua extrao, coloque sempre a sua Unit na primeira posio dalista da clusula Uses, assim ela ser a primeira a ser executada.PS: uso da MIDAS.DLL foi apenas para fins didticos, o delphi permite o uso dasunits MidasLib+Crtl para distribuio desse arquivo de forma mais simples.

    Adenilton Rodriguestem formao superior em Anlise de Sistemas. Consultorem Tecnologias de Desenvolvimento Internet e atualmente responde peloDepartamento de Tecnologia da SOL - Servios Online (www.solnet.com.br), ondeimplanta solues em Delphi, Java e .NET.

    mailto:[email protected]:[email protected]://www.solnet.com.br/http://www.solnet.com.br/http://www.solnet.com.br/http://www.solnet.com.br/mailto:[email protected]