PDA

Ver la Versión Completa : Problema con DLL


pruz
15-09-2003, 18:04:55
Hola amigos

Tengo el siguiente problema, he creado un DLL con delphi, y la estoy cargando en forma dinamica.
bueno esto lo hice siguiendo las instrucciones de dos libros, los pasos son los siguientes:
cree las variables, carge la DLL en memoria, ejecute la funciones que estan en la DLL, libere la memoria de la DLL, esta aqui todo OK. pero cuando se ejecuta la siguiente instruccion sea cual sea esta, me da un ERROR DE MEMORIA. cambien la instruccion y el mismo ERROR, pero luego saco la DLL, y todo bien sin ERROR.

alguien me puede dar las instruciones para hacer esto bien paso a paso, porque alomejor estoy haciendo algo MAL

Saludos, y Gracias
Uso Delphi 6.0

delphi.com.ar
15-09-2003, 18:30:25
Los términos que empleas son demasiado genéricos... ¿No puedes pasarnos las partes de código principales?, así almenos tenemos una idea del problema.

Saludos!

pruz
16-09-2003, 16:42:18
Ok, aqui va el codigo

unit UAcceso;

interface

uses

type
DLLEncripta = Function(Clave_Encripta: String):String;
DLLDesEncripta = Function(Clave_Encripta: String):String;
DLLValidaRegistro = Function( Crut, Cnom, cReg1, cReg2, cSistema : String ) : Integer;

type

TFAcceso = class(TForm)
ksoBalloonForm1: TksoBalloonForm;
EEmpresa: TEdit;
EUsuario: TEdit;
EPassword: TEdit;
BAcepta: TdxButton;
procedure BAceptaClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
InstanciaDLL : THandle;
Encripta : DLLEncripta;
DesEncripta : DLLDesEncripta;
ValidaRegistro: DLLValidaRegistro;
FAcceso: TFAcceso;
Ok_Usuario, Ok_Empresa : Boolean;
Clave : String[10];
Implementation

Uses Usiscont, Datos;
{$R *.DFM}

procedure TFAcceso.BAceptaClick(Sender: TObject);
begin
if not ModuloDatos.QAcceso.Eof then begin
Ok_Usuario := True;
InstanciaDll := LoadLibrary('claves.dll');
if InstanciaDll = 0 then begin
Mensaje.MessageDlg( 'Error en Carga de Dll.' , mtError , [mbCancel] , 0 ) ;
exit;
end;
try
@Encripta := GetProcAddress(InstanciaDll,'Encripta');
if @Encripta <> nil then Clave := Encripta(Trim(Epassword.Text))
else Mensaje.MessageDlg( 'Error de Procedimiento de Dll.' , mtError , [mbCancel] , 0 ) ;
finally
FreeLibrary(InstanciaDll);
end;
if ModuloDatos.QAcceso['ClaveUsuario'] <> Clave then Ok_Usuario := False;
if not Ok_Usuario then begin
Mensaje.MessageDlg( 'Acceso Denegado. Usuario o Clave mal Digitado..' , mtError , [mbCancel] , 0 ) ;
Epassword.SetFocus;
end else begin
TipoUsuario := EUsuario.Text;
Acceso := ok_Usuario;
Ok_Empresa := False;

if Ok_Usuario then begin
//busca claves y empresa
ModuloDatos.parametros.open;
if ModuloDatos.Parametros.Locate( 'RUTEMP' , Trim(EEmpresa.Text) , [ loCaseInsensitive ] ) then begin
Empresa := Trim( EEmpresa.Text);
Acceso := Ok_usuario;
InstanciaDll := LoadLibrary('claves.dll');
if InstanciaDll = 0 then begin
Mensaje.MessageDlg( 'Error en Carga de Dll.' , mtError , [mbCancel] , 0 ) ;
exit;
end;
try
@ValidaRegistro := GetProcAddress(InstanciaDll,'ValidaRegistro');
if @ValidaRegistro <> nil then Ok_Empresa := ValidaRegistro(ModuloDatos.Parametros['Rutemp'],ModuloDatos.Parametros['Empresa'],ModuloDatos.Parametros['Reguno'],ModuloDatos.Parametros['Regdos'],'Contabilidad') = 1
else Mensaje.MessageDlg( 'Error de Procedimiento de Dll.' , mtError , [mbCancel] , 0 ) ;
finally
FreeLibrary(InstanciaDll);
end;
if Ok_empresa then begin
//Mensaje.MessageDlg( 'Empresa Ok' , mtError , [mbCancel] , 0 ) ;

end else begin
Mensaje.MessageDlg( 'Empresa no Registrada' , mtError , [mbCancel] , 0 ) ;
Acceso := False;
close;
end;
end else begin
Mensaje.MessageDlg( 'Rut Empresa No Existe' , mtError , [mbCancel] , 0 ) ;
EEmpresa.SetFocus;
end;

end;
end;
end else begin
Mensaje.MessageDlg( 'Acceso Denegado. Usuario o Clave mal Digitado..' , mtError , [mbCancel] , 0 ) ;
Epassword.SetFocus;
end;
ModuloDatos.QAcceso.Close; //aqui da error
if not Ok_usuario then //aqui da error
ModuloDatos.Contabilidad.Connected := False ;
except
Mensaje.MessageDlg( 'Error en la Conexión' , mtError , [mbCancel] , 0 ) ;
EEmpresa.SetFocus;
end ;
end;

end.

delphi.com.ar
16-09-2003, 17:00:47
Faltaría ver cómo has declarado las funciones dentro de la DLL.. ¿Son stdcall?...
Pero te adelanto una recomendación: cambia los tipos de datos string por PChar, que los valores retornen en parámetros por referencia, y reserva la memoria de estos con anterioridad...

(Insisto que es una recomendación, pero no creo que obligatoriamente necesites que sea así)

Saludos!

jachguate
17-09-2003, 08:19:47
Seguramente es por que pasas strings como parámetros de la función. Hay una unidad que debes anteponer en la clausula uses de ambos lados (en la DLL y en donde importas las funciones) cuando queres que todo funcione bien.

El nombre de la unidad no lo recuerdo, pero fácil lo encontras en la ayuda de Delphi buscando en el tema de Strings y Libraries

Hasta luego.

;)