Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 15-09-2003
pruz pruz is offline
Miembro
 
Registrado: sep 2003
Posts: 170
Poder: 21
pruz Va por buen camino
Unhappy Problema con DLL

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
Responder Con Cita
  #2  
Antiguo 15-09-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
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!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #3  
Antiguo 16-09-2003
pruz pruz is offline
Miembro
 
Registrado: sep 2003
Posts: 170
Poder: 21
pruz Va por buen camino
Talking

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.
Responder Con Cita
  #4  
Antiguo 16-09-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
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!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.

Última edición por delphi.com.ar fecha: 16-09-2003 a las 17:03:26.
Responder Con Cita
  #5  
Antiguo 17-09-2003
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cool

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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 03:09:29.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi