Escolar Documentos
Profissional Documentos
Cultura Documentos
Normalmente um programador possui vrias funes que so utilizadas em vrios aplicativos. Qual o melhor lugar para armazen-los? E como posso fazer uso de rotinas que a linguagem de programao que utilizo no permite (como no Visual Basic)? A soluo para esses problemas o uso de DLLs (Dinamic Link Libraries). Um DLL um programa que permite que vrios programas possam acessar as mesmas funes, independentemente de linguagem.
Criando DLLs:
Para que uma procedure ou funo possam ser utilizados, necessrio informar que eles podem ser exportados (utilizados por outros aplicativos), colocando-se as diretivas stdcall; export; aps sua declarao. 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 no seja informado no poder ser utilizado por outros programas. Um exemplo completo de criao 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.
H dois mtodos de colocar um DLL em um programa: o mtodo esttico e o dinmico. A diferena entre eles que no primeiro caso, o DLL carregado com o programa, e no roda sem ele. Ou seja, caso o DLL no esteja no diretrio do programa ou no diretrio do Windows, o programa no executa. No segundo mtodo, o DLL executado durante a execuo do programa, e pode ser liberado da memria logo aps a execuo. Usar o melhor mtodo uma questo de escolha.
Mtodo Esttico: implementation function AreaQuadrado(Lado : Integer) : Integer; external exemplo.dll index 1;
A declarao de uma funo ou procedure externa praticamente idntica declarao de uma funo comum, as nicas diferenas so: No necessrio incluir a declarao na seo interface, somente na implementation; No necessrio colocar begin - end na funo, simplesmente declar-la suficiente.
Mtodo Dinmico: 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 2
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;
Nunca faa acesso a dados confidenciais em DLLs (como esquemas de senha), mesmo que precise ser usado em vrias linguagens. mais fcil, porm menos seguro (pode ser que algum cracker - usar hacker como pirata de computador um erro - descubra o ndice do DLL e faa uso indevido do programa); Tome cuidado com o tipo String. O Delphi implementa o uso de strings longas, mas pode ser que outras linguagens no a implementem. Portanto recomendvel o uso de ShortString ou PChar como tipo de retorno em funes e em parmetros de Strings; Sempre trate qualquer tipo de erro a partir do DLL: caso ela no seja tratada, o erro vai vazar para o programa, e o resultado impossvel de se dizer com preciso; Lembre-se de sempre remover os DLLs da memria (quando for fazer acessos dinmicos); Nunca se esquea de colocar o seu DLL em um dos seguintes diretrios: o diretrio do programa, o diretrio do Windows (normalmente C:\Windows), o diretrio de sistema do Windows (normalmente C:\Windows\System) ou qualquer diretrio que esteja na clusula PATH do arquivo AutoExec.Bat.