Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-03-2005
PedroAlfonso PedroAlfonso is offline
Miembro
 
Registrado: mar 2005
Posts: 34
Poder: 0
PedroAlfonso Va por buen camino
Talking DLL parámetros de salida (OUT)

AYUDA POR FAVOR!!! TENGO EL TIEMPO ENCIMA....

Debo usar una funcion que esta en UF100.DLL, esta función tiene 5 parámetros, dos de ellos son de salida (out), me debería devolver valores pchar .
Al ejecutar la función me marca error: "ACCESS VIOLATION....reading address"
Todas las demás funciones de este DLL funcionan correctamente, pero usan paramétros normales.
Ya intenté usando SHAREMEM en el uses, en el help dice que sirve para controlar la memoria pero que debe usarse en el DLL y el .exe, pero este DLL es de VB y por lo tanto no puedo usar el SHAREMEM.
Cualquier sugerencia se las agradeceré infinitamente....
Responder Con Cita
  #2  
Antiguo 05-03-2005
Avatar de vic_ia
vic_ia vic_ia is offline
Miembro
 
Registrado: ene 2004
Posts: 238
Poder: 21
vic_ia Va por buen camino
Hola...

me imagino que el "ACCESS VIOLATION" se debe a que no pasas correctamente los parametros, como son parametros de salida y te regresan un PChar, debes considerar "dimensionar" la variable que pasas para que el valor devuelto por la función quede correctamente,... espero te sirva el tip...

saludos...
Responder Con Cita
  #3  
Antiguo 05-03-2005
PedroAlfonso PedroAlfonso is offline
Miembro
 
Registrado: mar 2005
Posts: 34
Poder: 0
PedroAlfonso Va por buen camino
Talking Gracias por tu respuesta

A continuación escribo la función del DLL (el manual esta escrito para VB)

Int EnrollUser(char *Template, char *ImagePath, char *GuideMessage, HWND Owner, int x1, int y1, int x2, int y2, int Core)

y esta es mi función en delphi

type
TEnroll = function(Out Template char; ImagePath char;Out GuideMessage char;HOwner,x1,y1,x2,y2,Core :integer): integer; stdcall;


Te agradeceré muchisimo si me explicas un poco acerca de "dimensionar"
Responder Con Cita
  #4  
Antiguo 05-03-2005
Avatar de vic_ia
vic_ia vic_ia is offline
Miembro
 
Registrado: ene 2004
Posts: 238
Poder: 21
vic_ia Va por buen camino
hola...

desconozco VB, pero creo tu "traslado" de la función es correcta ...

tal vez si pusieras parte del codigo desde donde la llamas (incluyendo las variables que asignas a la llamada) podriamos ver si es por ahi donde esta la falla...

saludos...
Responder Con Cita
  #5  
Antiguo 05-03-2005
PedroAlfonso PedroAlfonso is offline
Miembro
 
Registrado: mar 2005
Posts: 34
Poder: 0
PedroAlfonso Va por buen camino
Talking Gracias por tu respuesta

type
TEnroll = function(Out Template :Pchar; ImagePath char; Out GuideMessage :Pchar;
HOwner,x1,y1,x2,y2,Core :integer): integer; stdcall;
TEstaELDedo = function(): Integer; stdcall;
TCapturaFP = procedure(HOwner,x1,y1,x2,y2,Core :integer); stdcall;

var
Form1: TForm1;

implementation

{$R *.dfm}
{$H+}

procedure TForm1.EnrollClick(Sender: TObject);
var
hLib: Cardinal;
Enrola: TEnroll;
Template,GuideMessage : Pchar;
res : integer;
begin
hLib := LoadLibrary('UF100.DLL');
Enrola := GetProcAddress(hLib,'EnrollUser');
res := Enrola(Template,'D:\MIENTRAS\prueba.bmp',GuideMessage,Form1.Handle,0,0,0,0,1);
Memo1.Lines.Add('Enrola :'+intToStr(Res));
FreeLibrary(hLib);
end;
Responder Con Cita
  #6  
Antiguo 05-03-2005
Avatar de vic_ia
vic_ia vic_ia is offline
Miembro
 
Registrado: ene 2004
Posts: 238
Poder: 21
vic_ia Va por buen camino
hola...

al ver tu función creo que el problema esta en que si, efectivamente declaras una variable de tipo PChar, pero esta apunta a ningun lado, por lo que al tratar la función de ponerte en ella los resultados pues te manda el error que mencionas, lo que tienes que hacer es "reservar" para esa variable (apuntador) el espacio de memoria suficiente para valor de retorno...

para un manejo mas sencillo yo cambiaria algunas lineas como sigue :
Código Delphi [-]
// en lugar de :
  Template,GuideMessage : Pchar;
// pondria :
  Template, GuideMessage : String;
//...
// antes de llamar a la función hay que asignarle el espacio SUFICIENTE para
// el valor de retorno (supongo que el manual del que hablas algo te ha de
// sugerir, o cuando menos dale mas de lo que piensas pueda regresar)
// suponiendo  que no te regresa en ese valor mas de 100 caracteres, pondria  :
  SetLength(Template, 100);
  SetLength(GuideMessage, 100);
// en lugar de :
res := Enrola(Template,'D:\MIENTRAS\prueba.bmp',GuideMessage,Form1.Handle,0,0,0,0,1);
// haria un typecast para que se ajustaran los parametros a los requeridos...
res := Enrola(PChar(Template),'D:\MIENTRAS\prueba.bmp',PChar(GuideMessage),Form1.Handle,0,0,0,0,1);
// despues de llamar a la función seria conveniente que ajustaras al veradero
// tamaño de las cadenas que te ha devuelto, nuevamente llamando a SetLength
  SetLength(Template, StrLen(PChar(Template)));
  SetLength(GuideMessage, StrLen(PChar(GuideMessage)));
asi me ha funcionado, pero en el foro hay personas mas versadas en estos manejos por lo que puede que alguien te de una mejor sugerencia.

espero te sirva...

saludos...
Responder Con Cita
  #7  
Antiguo 05-03-2005
PedroAlfonso PedroAlfonso is offline
Miembro
 
Registrado: mar 2005
Posts: 34
Poder: 0
PedroAlfonso Va por buen camino
Talking Gracias por tu ayuda

Ya casi salgo del problema, ahora solo me marca el siguiente error, lamentablemente no sé como resolverlo:

en la linea:

res := Enrola(PChar(Template),'D:\MIENTRAS\prueba.bmp',PChar(GuideMessage) , Form1.Handle,0,0,0,0,1);

[Error] PruebaHuella.pas(53): Constant object cannot be passed as var parameter

Espero me puedas ayudar.
Te agradezco mucho
Responder Con Cita
  #8  
Antiguo 05-03-2005
Avatar de vic_ia
vic_ia vic_ia is offline
Miembro
 
Registrado: ene 2004
Posts: 238
Poder: 21
vic_ia Va por buen camino
hola...

bueno es cierto, no habia notado ese detalle, si te fijas es del mismo tipo de parametros que los otros dos, por lo que no puedes pasar un valor constante, en este caso una cadena literal, lo que debes hacer es simplemente definir una variable asi:
Código Delphi [-]
...
  Archivo : String;
...
//  asignarle el valor a la variable :
  Archivo := 'D:\MIENTRAS\prueba.bmp';
// y de igual forma hacer un typecast al pasarlo a la función :
res := Enrola(PChar(Template),PChar(Archivo),PChar(GuideMessage) , Form1.Handle,0,0,0,0,1);
espero te ayude...

saludos...
Responder Con Cita
  #9  
Antiguo 05-03-2005
PedroAlfonso PedroAlfonso is offline
Miembro
 
Registrado: mar 2005
Posts: 34
Poder: 0
PedroAlfonso Va por buen camino
Talking Gracias por tu ayuda

Sigo con error, ya intente usar GetMem pero marca el mismo error.

Me parece que debo cambiar de utilerías.....
Responder Con Cita
  #10  
Antiguo 05-03-2005
Avatar de vic_ia
vic_ia vic_ia is offline
Miembro
 
Registrado: ene 2004
Posts: 238
Poder: 21
vic_ia Va por buen camino
hola...

se me ocurre que tal vez solo te faltaria agregar la palabra clave var al parametro ImagePath de la definición de la funcion en delphi

TEnroll = function(Out Template : Pchar; var ImagePath : Pchar; Out GuideMessage : Pchar;
HOwner,x1,y1,x2,y2,Core :integer): integer; stdcall;

prueba con ello....
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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 20:58:18.


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