![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
![]() 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 |
#2
|
||||
|
||||
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. ![]() |
#3
|
|||
|
|||
![]() 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. |
#4
|
||||
|
||||
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. |
#5
|
||||
|
||||
![]() 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 |
![]() |
|
|
![]() |
|