Carregar Função Dll Dinamicamente ?
Pessoal tem a seguinte função em uma Dll
function ShowMapaTanques(Mapa :ShortString):String ;Stdcall ;
begin
if FrMapaTanques =nil Then
FrMapaTanques :=TFrMapaTanques.Create(nil);
FrMapaTanques.ShowModal ;
end;
Exports ShowMapaTanques ;
begin
end.
Fiz da Seguinte forma
Type
TTipoFuncao = function (Mapa : ShortString): String ;StdCall ;
Const
NomeDll =´ModuloPosto.Dll´ ;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
Var
Dll :THandle ;
funcao: TTipoFuncao;
begin
Dll := LoadLibrary(NomeDll);
funcao := GetProcAddress(Dll,´ShowMapaTanques´);
FreeLibrary(Dll) ;
+ Não Carregar não faz Nada o que será que está faltando.
Obrigado a Tds !!
function ShowMapaTanques(Mapa :ShortString):String ;Stdcall ;
begin
if FrMapaTanques =nil Then
FrMapaTanques :=TFrMapaTanques.Create(nil);
FrMapaTanques.ShowModal ;
end;
Exports ShowMapaTanques ;
begin
end.
Fiz da Seguinte forma
Type
TTipoFuncao = function (Mapa : ShortString): String ;StdCall ;
Const
NomeDll =´ModuloPosto.Dll´ ;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
Var
Dll :THandle ;
funcao: TTipoFuncao;
begin
Dll := LoadLibrary(NomeDll);
funcao := GetProcAddress(Dll,´ShowMapaTanques´);
FreeLibrary(Dll) ;
+ Não Carregar não faz Nada o que será que está faltando.
Obrigado a Tds !!
Essistemas
Curtidas 1
Respostas
Emerson Nascimento
20/10/2004
tente assim:
type
    {Definições do seu formulário}
    private
        {private declarations}
    public
        {public declarations}
    end;
function ShowMapaTanques(Mapa: ShortString):String; StdCall; external ´ModuloPosto.Dll´;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var Retorno: shortstring;
begin
    Retorno := ShowMapaTanques( ParâmetroDesejado );
end;
acho essa maneira mais simples.
de qualquer forma, a sua rotina não funcionava pois você simplesmente ´pegava´ a função mas não a executava. pra resolver, mantendo aquele mesmo código, tente:
procedure TForm1.Button1Click(Sender: TObject);
var
    Dll :THandle ;
    funcao: TTipoFuncao;
    Retorno: shortstring;
begin
    Dll := LoadLibrary(NomeDll);
    if DLL = 0 then
        MostraMsgErro
    else
    begin
        @funcao := GetProcAddress(Dll,´ShowMapaTanques´);
        if @funcao nil then
            retorno := funcao( ParâmetroDesejado );
        FreeLibrary(Dll);
    end;
end;
type
    {Definições do seu formulário}
    private
        {private declarations}
    public
        {public declarations}
    end;
function ShowMapaTanques(Mapa: ShortString):String; StdCall; external ´ModuloPosto.Dll´;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var Retorno: shortstring;
begin
    Retorno := ShowMapaTanques( ParâmetroDesejado );
end;
acho essa maneira mais simples.
de qualquer forma, a sua rotina não funcionava pois você simplesmente ´pegava´ a função mas não a executava. pra resolver, mantendo aquele mesmo código, tente:
procedure TForm1.Button1Click(Sender: TObject);
var
    Dll :THandle ;
    funcao: TTipoFuncao;
    Retorno: shortstring;
begin
    Dll := LoadLibrary(NomeDll);
    if DLL = 0 then
        MostraMsgErro
    else
    begin
        @funcao := GetProcAddress(Dll,´ShowMapaTanques´);
        if @funcao nil then
            retorno := funcao( ParâmetroDesejado );
        FreeLibrary(Dll);
    end;
end;
GOSTEI 0
Andrew Vargas
20/10/2004
Se alguém souber, por favor me ajude, pois eu também estou perdido com o uso de dll, caso puderem me dar uma dica, fica aqui o link da minha pergunta, que é um tanto similar à essa minha pergunta
Valeu gurizada.
Valeu gurizada.
GOSTEI 0
Andrew Vargas
20/10/2004
Se alguém souber, por favor me ajude, pois eu também estou perdido com o uso de dll, caso puderem me dar uma dica, fica aqui o link da minha pergunta, que é um tanto similar à essa minha pergunta
Valeu gurizada.
Valeu gurizada.
GOSTEI 0