You are on page 1of 2

H

F-XC A N GE

H
F-XC A N GE

N
y
bu
k

to

Embutir uma DLL no executvel

c u-tr a c k

.d o

.c

Como embutir uma DLL no executvel evitando sua distribuio separadamente

.d o

lic

15/12/2008

lic

to

bu

O
W
!

PD

O
W
!

PD

c u-tr a c k

por Adenilton Rodrigues


Basic amente a tc nica c onsiste em transformar o arquivo DLL (pode ser qualquer arquivo: imagem, som, etc ) em um arquivo de recursos e adic ion-lo ao
pac ote do executvel (extenso .res). Quando houver a nec essidade do seu uso, ele pode ser extrado e salvo temporariamente (ou definitivamente).
TRANSFORMANDO O ARQUIVO DLL em RES
Neste pequeno roteiro irei demonstrar como incorporar o arquivo MIDAS.DLL ao seu
arquivo EXE e sua extrao automtic a quando o programa for exec utado.
Primeiro prec isamos transformar o arquivo MIDAS.DLL em um arquivo de rec ursos,
o qual c hamaremos de MIDAS.RES.

1. V ao prompt do DOS e c rie um arquivo qualquer no formato texto com a extenso .rc (para manter uma coernc ia, chamarei-o de MIDAS.RC).
Esse arquivo dever possuir uma linha para cada arquivo a ser transformado em rec urso. Nesse exemplo c onter apenas uma linha, pois trabalharei
apenas 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 ac har o rec urso).
O segundo apenas um identific ador do tipo de arquivo.
O terceiro o path onde o c ompilador de rec ursos ir busc ar o arquivo para
transformar em .RES.

2. Exec ute o compilador de recursos que acompanha o delphi: Est na pasta BIN e se chama BRCC32.EXE. Este um programa do DOS, portanto se
voc no estiver na pasta BIN do delphi, tenha a c erteza que sua vriavel PATH esteja apontando para l. ( Se quiser c onfigurar 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 existnc ia do arquivo MIDAS.RES (Se no
enc ontrar, revise os proc edimentos).
CRIANDO UM PROGRAMA QUE LEVA A DLL EMBUTIDA
Veja agora c omo c riar um programa que embute a DLL no seu executvel:

1. Crie um projeto com um form e c oloque um TButton.


2. No cdigo fonte da Unit voc encontrar o seguinte include: {$R *.DFM}
Logo abaixo dele inc lua o seu arquivo de rec urso da seguinte maneira:
{$R MIDAS.RES}
Fic ar assim:
{$R *.DFM}
{$R MIDAS.RES}
Obs: Voc pode c oloc ar sua include em qualquer parte do programa (o linker o achar), c ontudo o ideal nesta seo para fac ilitar a loc aliza o
visual dos recursos utilizados pela sua aplic a o.
Nesse momento se voc compilar seu projeto, o arquivo MIDAS.DLL j estar inc orporado ao executvel da aplica o.
Veja como extrair a DLL em tempo de c digo.
Uma veja inc orporado ao exec utvel um rec urso, ser necessrio extrai-lo antes do seu uso (Depois mostrarei uma tc nic a de autoextra o).
O Delphi possui uma Classe que permite a manipula o de recursos, a TResourc eStream. A rotina abaixo extrai o arquivo MIDAS.DLL e salva no diretorio
da aplic ao:
Procedure SaveMidas;
Var PathToSave : String;
Res : TResourc eStream;
Begin
PathToSave := ExtractFilePath(Applic ation.ExeName)+'\MIDAS.DLL';
If not FileExists(PathToSave) Then Begin
Res := TResourceStream.Create(Hinstanc e, 'MIDASDLL', 'DLLFILE');
Try
Res.SavetoFile(PathToSave);
Finally
Res.Free;
End;
End;
End;
Para exec ut-la, no OnClick do boto escreva: SaveMidas;
Veja o cdigo c ompleto:
uses
Windows, Messages, SysUtils, Classes, Graphic s, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)

www.delphibr.com.br/artigos/res.php

1/2

.c

H
F-XC A N GE

H
F-XC A N GE

N
y
bu
k

to

Embutir uma DLL no executvel

.d o

Begin
.c
.d o
ck
tory(Buffer,144);
c u - t r aGetSystemDirec
Result := StrPas(Buffer);
End;

lic

15/12/2008

lic

to

bu

O
W
!

PD

O
W
!

PD

c u-tr a c k

.c

end.
AUTO-EXTRAINDO A DLL
Uma tcnic a interessante a auto-extra o da DLL no momento da inic ializao de sua aplica o sem a nec essidade da c hamada explicita procedure
SaveMidasDLL.
Vamos utilizar o recurso de auto-inic ializa o das Units implementado pelo Delphi.
Para quem no c onhece, o Delphi quando carrega uma Unit ele exec uta automaticamente o c digo dentro do bloc o INITIALIZATION antes mesmo da
aplicao ser totalmente inicializada, um exc elente ganc ho para se coloc ar rotinas de inic ializa o. O mais espertos j perc eberam que o Bloc o
FINALIZATION faz o mesmo efeito, porm ao finalizar a exec u o da aplic a o.
Para ver a auto-extrao, ac resc ente o bloc o de c digo abaixo ao final da Unit do Form:
Initialization
Begin
ShowMessage('Gerando o arquivo MIDAS.DLL');
SaveMidasDLL;
End;
End.
Veja que agora, quando o form criado (e a unit ac ionada), a procedure SaveMidasDLL exec utada automaticamente.
PROBLEMAS
Dependendo da forma c omo sua aplic ao foi criada voc pode se deparar com um problema: Uma parte do cdigo pode estar c hamando um arquivo que
ainda no foi extraido (situa o muito comum c om aplic aes que c hamam DLL's na sua inic ializa o).
Uma boa tc nica ac rescentar o c digo de extrao no arquivo .DPR, assim ele ser ac ionado antes de qualquer outra rotina da aplic ao.
Eu partic ularmente prefiro outra tcnic a: Colocar as rotinas de auto-extra o em uma unit exclusiva e c ham-la primeiramente na minha aplic ao, o
cdigo fic a mais limpo, e t odas as vezes que voc prec isar usar o rec urso basta apenas acresc ent- la sua c lusula Uses.
Veja o cdigo pronto:
unit AutoMidas;
interface
Uses Windows, Classes, Sysutils, Forms,Dialogs;
Function Extrac tSystemDir : String;
Procedure SaveMIDASDLL;
implementation
{$R MIDAS.RES}
Procedure SaveMIDASDLL;
Var PathToSave:String;
Res : TResourc eStream;
Begin
PathToSave := ExtractFilePath(Applic ation.ExeName)+'\MIDAS.DLL';
If not FileExists(PathToSave) Then Begin
Res := TResourceStream.Create(Hinstanc e, 'MIDASDLL', 'DLLFILE');
Try
Res.SavetoFile(PathToSave);
Finally
Res.Free;
End;
End;
End;
Function Extrac tSystemDir : String;
Var Buffer : Array[0..255] of Char;
Begin
GetSystemDirec tory(Buffer,144);
Result := StrPas(Buffer);
End;
Initialization
Begin
ShowMessage('Gerando o arquivo MIDAS.DLL');
SaveMidasDLL;
End;
end.

Importante: Para evitar o problema menc ionado acima, onde a aplic a o chama o arquivo antes de sua extra o, coloque sempre a sua Unit na primeira posi o da lista
PS: uso da MIDAS.DLL foi apenas para fins didtic os, o delphi permite o uso das units MidasLib+Crtl para distribui o desse arquivo de forma mais simples.
Adenilton Rodrigues tem forma o superior em Anlise de Sistemas. Consultor em Tecnologias de Desenvolvimento Internet e atualmente responde pelo
Departamento de Tec nologia da SOL - Servios Online (www.solnet.c om.br), onde implanta solu es em Delphi, Java e .NET.

www.delphibr.com.br/artigos/res.php

2/2

You might also like