DLL recebendo valores errados de variaveis - Delphi 2010.
Bom dia pessoal.
To com um sério problema aqui e não consigo resolver.
Tenho uma variavel com um Form, onde o chamo na aplicação principal.
O Código da DLL é esse:
library SDSCADBAS;
uses
ShareMem,
SysUtils,
Classes,
Dialogs,
IBDatabase,
Forms,
UDMCadBas in 'UDMCadBas.pas' {Dados: TDataModule},
UCadUsuario in 'UCadUsuario.pas' ;
{$R *.res}
Procedure ShowUsuario(Tela, Usuario: Integer); stdcall;
begin
InitializeDll;
try
FrmUsuario:= TFrmUsuario.Create(nil);
FrmUsuario.ShowModal;
FrmUsuario.Destroy;
finally
ReleaseDll;
end;
end;
//sessão onde exporta-se as procedures e funções da DLL.
exports
ShowUsuario;
begin
end.
Na minha aplicação Chamo essa procedure dessa DLL dessa maneira.
type
TMetodo = Procedure(Tela, Usuario: AnsiString);
procedure TFrmPrinc.CapturaClick(Sender: TObject);
var
Formulario: TFormClass;
NomeDLL, NomeForm, OpcaoMenu: String;
HInst: THandle;
FDLL: TFarProc;
FormDLL: TMetodo;
begin
if Banco.QryMenu1.FieldByName('FUNCAO').AsString = 'DLL' then begin
CodTela:= Banco.QryMenu1.FieldByName('CODIGO').AsInteger;
NomeDLL:= Banco.QryMenu1.FieldByName('NOMEDLL').AsString;
NomeForm:= Banco.QryMenu1.FieldByName('FUNCAODLL').AsString;
HInst := LoadLibrary(PChar(NomeDLL));//carrega a DLL a ser utilizada.
FDLL := MethodAddress(NomeForm); //converte a String para Procedimento.
FormDLL:= GetProcAddress(HInst,PChar(NomeForm));
try
FormDLL(CodTela, CodUsuario);
except
ShowMessage('Erro ao tentar abrir Tela, contate o Suporte!');
end;
end;
end;
Quando executo o código, simplesmente ele não passa os valores corretos para a DLL.
Estou passando por exemplo. Tela = 1 e Usuario = 1;
Quando debugo a DLL, chega um valor la assim.
Tela = 1254356 e Usuario = 8763872.
Ja fuçei um monte na internet, tentei um monte de coisas e não consigo resolver esse problema.
Alguem sabe o que to fazendo de errado?
Qualquer ajuda é muito bem vinda.
Estou usando Delphi 2010.
Muito obrigado a todos. Te mais.
To com um sério problema aqui e não consigo resolver.
Tenho uma variavel com um Form, onde o chamo na aplicação principal.
O Código da DLL é esse:
library SDSCADBAS;
uses
ShareMem,
SysUtils,
Classes,
Dialogs,
IBDatabase,
Forms,
UDMCadBas in 'UDMCadBas.pas' {Dados: TDataModule},
UCadUsuario in 'UCadUsuario.pas' ;
{$R *.res}
Procedure ShowUsuario(Tela, Usuario: Integer); stdcall;
begin
InitializeDll;
try
FrmUsuario:= TFrmUsuario.Create(nil);
FrmUsuario.ShowModal;
FrmUsuario.Destroy;
finally
ReleaseDll;
end;
end;
//sessão onde exporta-se as procedures e funções da DLL.
exports
ShowUsuario;
begin
end.
Na minha aplicação Chamo essa procedure dessa DLL dessa maneira.
type
TMetodo = Procedure(Tela, Usuario: AnsiString);
procedure TFrmPrinc.CapturaClick(Sender: TObject);
var
Formulario: TFormClass;
NomeDLL, NomeForm, OpcaoMenu: String;
HInst: THandle;
FDLL: TFarProc;
FormDLL: TMetodo;
begin
if Banco.QryMenu1.FieldByName('FUNCAO').AsString = 'DLL' then begin
CodTela:= Banco.QryMenu1.FieldByName('CODIGO').AsInteger;
NomeDLL:= Banco.QryMenu1.FieldByName('NOMEDLL').AsString;
NomeForm:= Banco.QryMenu1.FieldByName('FUNCAODLL').AsString;
HInst := LoadLibrary(PChar(NomeDLL));//carrega a DLL a ser utilizada.
FDLL := MethodAddress(NomeForm); //converte a String para Procedimento.
FormDLL:= GetProcAddress(HInst,PChar(NomeForm));
try
FormDLL(CodTela, CodUsuario);
except
ShowMessage('Erro ao tentar abrir Tela, contate o Suporte!');
end;
end;
end;
Quando executo o código, simplesmente ele não passa os valores corretos para a DLL.
Estou passando por exemplo. Tela = 1 e Usuario = 1;
Quando debugo a DLL, chega um valor la assim.
Tela = 1254356 e Usuario = 8763872.
Ja fuçei um monte na internet, tentei um monte de coisas e não consigo resolver esse problema.
Alguem sabe o que to fazendo de errado?
Qualquer ajuda é muito bem vinda.
Estou usando Delphi 2010.
Muito obrigado a todos. Te mais.
Marcos Paulo
Curtidas 0
Respostas
José Silva.
11/04/2011
Tente usar stdcall na assinatura do método. Assim:type TMetodo = Procedure(Tela, Usuario: Integer); stdcall;
Espero que possa lhe ajudar
Espero que possa lhe ajudar
GOSTEI 0
Marcos Paulo
11/04/2011
Olá José.
Muito obrigado pela sua ajuda.
Consegui resolver o problema usando o STDCALL;
Era isso mesmo que tava faltando aqui amigo.
Muito obrigado a todos, em especial ao José. Abraço.
Muito obrigado pela sua ajuda.
Consegui resolver o problema usando o STDCALL;
Era isso mesmo que tava faltando aqui amigo.
Muito obrigado a todos, em especial ao José. Abraço.
GOSTEI 0