funções em dll´s
Olá Pessoal!
Programo em Clipper a mais de cinco anos e agora estou migrando para Delphi e descobrindo o ‘mundo&8217; das dll&8217;s.
Bem! Meu problema é que não consigo chamar uma função dentro de outra função da mesma dll.
Por exemplo:
library exemplo;
uses
SysUtils,
Classes;
{$R *.res}
function FazAlgo( s : string ) : String;
begin
&8230;
s := FazMaisAlgumaCoisa(s);
...
end;
function FazMaisAlgumaCoisa ( s : string ) : String;
begin
&8230;
s := s+s;
...
end;
exports
FazAlgo index 1,
FazMaisAlgumaCoisa index 2;
end.
Desta forma funciona somente se FazMaisAlgumaCoisa for escrita antes de FazAlgo. Como resolvo isso? Pois tenho várias rotinas e , muitas delas dependem umas das outras.
Programo em Clipper a mais de cinco anos e agora estou migrando para Delphi e descobrindo o ‘mundo&8217; das dll&8217;s.
Bem! Meu problema é que não consigo chamar uma função dentro de outra função da mesma dll.
Por exemplo:
library exemplo;
uses
SysUtils,
Classes;
{$R *.res}
function FazAlgo( s : string ) : String;
begin
&8230;
s := FazMaisAlgumaCoisa(s);
...
end;
function FazMaisAlgumaCoisa ( s : string ) : String;
begin
&8230;
s := s+s;
...
end;
exports
FazAlgo index 1,
FazMaisAlgumaCoisa index 2;
end.
Desta forma funciona somente se FazMaisAlgumaCoisa for escrita antes de FazAlgo. Como resolvo isso? Pois tenho várias rotinas e , muitas delas dependem umas das outras.
Cristianosilva
Curtidas 0
Respostas
Paulo Amaral
27/04/2003
Talvez se você declarar também a função Fazmaisalgumacoisa junta com a declaração Fazalgumacoisa. Isto é, você deve dar visibilidade à todas as funções que serão usadas na Dll.
GOSTEI 0
Rebel_inside
27/04/2003
O que você poderia fazer é criar uma unit com essas funções e declarar os cabeçalhos das mesmas na [b:4231cf13ca]interface[/b:4231cf13ca].
Depois você coloca referência à esta unit na Unit da library (principal) e deixa o export do mesmo jeito.
exemplo [b:4231cf13ca]UMinhasFuncoes[/b:4231cf13ca]
unit UMinhasFuncoes;
interface
function FazAlgumCoisa(Param1, Param2: Integer): Integer;
function FazMaisAlgumaCoisa(Param1, Param2: Integer): Integer;
implementation
function FazMaisAlgumaCoisa(Param1, Param2: Integer): Integer;
begin
(...)
end;
function FazAlgumaCoisa(Param1, Param2: Integer): Integer;
begin
Result:= FazMaisAlgumaCoisa(Param1, Param2);
(...)
end;
end.
exemplo [b:4231cf13ca]DllExemplo[/b:4231cf13ca]
library DllExemplo;
uses SysUtils, Classes, [b:4231cf13ca][i:4231cf13ca]UMinhasFuncoes[/i:4231cf13ca][/b:4231cf13ca];
exports
FazAlgumaCoisa index 1,
FazMaisAlgumaCoisa index 2;
end.
------
Pronto, deste modo você tem uma DLL que consegue chamar as próprias funções.
Uma coisa importante para lembrar é que se você usa Strings na DLL (seja ela como parâmetros, resultados de funções ou em objetos/classes/estruturas(records)), você deve adicionar a Unit ShareMem como sendo a primeira da lista (uses ShareMem, SysUtils, Classes, ...) tanto da DLL quanto da aplicação que irá usa-la. E você também deverá usar a DLL da borland (se não me engano é algo como borlndmm.dll)
Aconselho dar uma boa lida no Help do Delphi sobre isso.
[]´s
Depois você coloca referência à esta unit na Unit da library (principal) e deixa o export do mesmo jeito.
exemplo [b:4231cf13ca]UMinhasFuncoes[/b:4231cf13ca]
unit UMinhasFuncoes;
interface
function FazAlgumCoisa(Param1, Param2: Integer): Integer;
function FazMaisAlgumaCoisa(Param1, Param2: Integer): Integer;
implementation
function FazMaisAlgumaCoisa(Param1, Param2: Integer): Integer;
begin
(...)
end;
function FazAlgumaCoisa(Param1, Param2: Integer): Integer;
begin
Result:= FazMaisAlgumaCoisa(Param1, Param2);
(...)
end;
end.
exemplo [b:4231cf13ca]DllExemplo[/b:4231cf13ca]
library DllExemplo;
uses SysUtils, Classes, [b:4231cf13ca][i:4231cf13ca]UMinhasFuncoes[/i:4231cf13ca][/b:4231cf13ca];
exports
FazAlgumaCoisa index 1,
FazMaisAlgumaCoisa index 2;
end.
------
Pronto, deste modo você tem uma DLL que consegue chamar as próprias funções.
Uma coisa importante para lembrar é que se você usa Strings na DLL (seja ela como parâmetros, resultados de funções ou em objetos/classes/estruturas(records)), você deve adicionar a Unit ShareMem como sendo a primeira da lista (uses ShareMem, SysUtils, Classes, ...) tanto da DLL quanto da aplicação que irá usa-la. E você também deverá usar a DLL da borland (se não me engano é algo como borlndmm.dll)
Aconselho dar uma boa lida no Help do Delphi sobre isso.
[]´s
GOSTEI 0