Delphi - Error en DLL !URGENTE!

 
Vista:

Error en DLL !URGENTE!

Publicado por El Pelotas (40 intervenciones) el 03/03/2005 23:41:50
Estimados Foristas:
Tengo un lector de huella digital, viene acompañado por DLL's, el manual esta hecho para progamar en VB :(

La función que quiero usar es la siguiente:

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

Entonces para que según yo funcione en Delphi 6 hice lo siguiente:

type
TEnroll = function (Template,ImagePath,GuideMessage:pchar;Owner:Cardinal;x1,y1,x2,y2,Core:int64): PChar;

procedure TForm1.EnrollClick(Sender: TObject);
var
hLib,: Cardinal;
Enrola: TEnroll;
t1,t2,t3,res : pchar;

begin
hLib := LoadLibrary('UF100.dll');
@Enrola := GetProcAddress(hLib,'EnrollUser');
res := Enrola(t1,t2,t3,Form1.ClientHandle,100,100,200,200,1);
Memo1.Lines.Add('Enrola :'+Res);
FreeLibrary(hLib);
end;

El problema es que me marca el siguiente error:

Access violation at adress 10013DC1 in Module "UF100.DLL" Write of Address 000000C8

Por favor necesito ayuda Saludos!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Error en DLL !URGENTE!

Publicado por [endless_loop] (11 intervenciones) el 04/03/2005 01:28:29
primero asegurate que el archivo existe, poniendo el IF y usando safeloadlibrary q aparece ahi.
Si Enrola es una variable del tipo FUNCTION con esos parametros, no uses el @ en la asignacion. la asignacion se hace directamente. Luego, proba seteando el ENROLA := nil antes de liberar la libreria.

procedure TForm1.EnrollClick(Sender: TObject);
var
hLib,: Cardinal;
Enrola: TEnroll;
t1,t2,t3,res : pchar;

begin
hLib := safeLoadLibrary('UF100.dll');
IF HLIB <> 0 THEN BEGIN
Enrola := GetProcAddress(hLib,'EnrollUser');
res := Enrola(t1,t2,t3,Form1.ClientHandle,100,100,200,200,1);
Memo1.Lines.Add('Enrola :'+Res);
Enrola := nil;
FreeLibrary(hLib);
END;
end;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Error en DLL !URGENTE!

Publicado por El Pelotas (40 intervenciones) el 04/03/2005 15:42:12
Muchisimas Gracias por contestar, ya hice las recomendaciones que me dices pero sigo con problemas.
A continuación copio las instrucciones del manual para ver quien me ayuda por favor, mi problema ahora es que hay dos variables que son de salida y me parece que en el manejo de memoria o algo asi es donde tengo el error. De antemano muchas gracias por la ayuda de todos.

Int EnrollUser(char *Template, char *ImagePath, char *GuideMessage, HWND Owner, int x1, int y1, int x2, int y2, int Core)
Parámetros:
· Template (Salida): Es una cadena que recibe él template de la huella recién capturada. Este template es el que se almacena para utilizarse después en las validaciones.
·· GuideMessage (Salida): Esta cadena recibe los mensajes de guía producidos por
el lector durante la captura. Estos le indicarán como colocar su dedo para obtener
una captura optima de la huella.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Error en DLL !URGENTE!

Publicado por [endless_loop] (11 intervenciones) el 04/03/2005 16:16:07
me olvide de decirte una recomendacion (no se si lo hiciste, pero aca va)
despues de declarar su llamada externa desde delphi, tenes q agregar la directiva cdecl;

por ejemplo

function ProbabilidadPoker(mano:TMano5Cartas):Cardinal; external 'pokerdll.dll'; cdecl;

bueno, suponiendo q en un DLL tengo esa funcion hecha en c++ (aunque en realidad estoy haciendo esa libreria en delphi, y hago una funcion para cada figura)

y otra cosa: me imagino q las cadenas las estas pasando como PChar, no?

Es decir...los parametros TEMPLATE y IMAGEPATH.

sino...fijate si el error esta en esa libreria :s.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Error en DLL !URGENTE!

Publicado por El Pelotas (1 intervención) el 04/03/2005 16:49:57
Funciona mejor si pongo stdcall en vez de cdecl.
Ya me devuelve resultado e inclusive realiza una tarea de grabar una imagen en disco (bmp)
Pero inmediatamente me marca error, y los parametros de salida no los puedo ver su valor.
Debe ser algun error al usar la memoria

Gracias por ayudarme
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Error en DLL !URGENTE!

Publicado por [endless_loop] (11 intervenciones) el 06/03/2005 06:14:59
Stdcall o Cdecl funcionaran segun como esten hechas las librerias x dentro... (cosa q yo no se, pero si segun vos anda mejor con stdcall, tonces es q la funcion debe estar hecha con stcall).

Lo de los parametros de salida...son las cadenas TEMPLATE y la otra?
La verdad no tengo mucha experiencia en C o C++...lo deje xq me parecio aburrido (en Delphi seria facil de ver...una amiga tenia el mismo error xq no uso VAR en los parametros XD XD XD).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Error en DLL !URGENTE!

Publicado por El Pelotas (2 intervenciones) el 07/03/2005 23:23:30
Endles:
Muchas gracias por tu ayuda, ya solucioné el problema, entre otros errores tenía que dimensionar las cadenas (strings) grandes para que no marcara error porque la función puede devolver las cadenas grandes.
Otro error fué que no se usa out en la función y de todas maneras devuelve los valores.
Y por último la función trabaja perfectamente con paramétros tipo string.

Te agradezco mucho, Saludos desde México
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar