Hola amigos del club.Tengo un problema y estoy bastante tiempo intentando solucionarlo, pero no se como hacerlo. Estoy intentando desde Delphi utilizar una función de una dll. Esta dll fue creada utilizando visual c++. Dicha función recibe como parámetro un puntero (o una dirección) a una estructura.
Las defincion de la estructura en C son:
Código:
typedef enum tipoEnumMes
{
enmEnero,
enmFebrero,
}enumMes;
//esto es un tipo enumerado. En Delphi sería: enumMes = (enmEnero, enmFebrero);
typedef enum tipoEnumDia
{
enmLunes,
enmMartes,
}enumDia;
//esto es un tipo enumerado. En Delphi sería: enumDia = (enmLunes, enmMartes);
typedef struct configuracion
{
enumMes Mes;
enumDia Dia;
char *FilePath; //puntero a cadena
int LifeTime;
int DeleteTime;
char *LibPath; //puntero a cadena
} TipoConfiguracion;
La función de la dll que utilizo en Delphi devuelve un entero y su definición en C es:
Código:
int iniciaCliente(TipoConfiguracion *paramStConf);
donde el parámetro es paramStConf y es un puntero (o una dirección) a la estructura de tipo TipoConfiguracion.
Ahora en Delphi hago lo siguiente:
Código Delphi
[-]
enumMes = (enmEnero, enmFebrero);
enumDia = (enmLunes, enmMartes);
TipoConfiguracion = packed record
Mes: enumMes;
Dia: enumDia;
FilePath: PChar;
LifeTime: integer;
DeleteTime: integer;
LibPath: PChar;
End;
TiniciaCliente = Function (ptrTipoConfiguracion: pointer): integer; cdecl;
iniciaCliente: TiniciaCliente
procedure CargaDll;
var
hdll:THandle; begin
hdll := LoadLibrary('libreria.dll');
if (hdll<>0) then
begin
@ iniciaCliente := GetProcAddress(hdll,' iniciaCliente');
end
end;
No tengo ningún problema al cargar la librería, el problema se presenta cuando quiero usar la función Ejm:
Código Delphi
[-]
procedure TForm1.Button1Click(Sender: TObject);
var
conf: TipoConfiguracion
iRpta: integer;
begin
conf.Mes:= enmEnero;
conf.Dia:= enmLunes;
conf.FilePath:= PChar(‘c:\’);
conf.LifeTime: 1;
conf.DeleteTime: 2;
conf.LibPath: PChar(‘c:\’);
iRpta := iniciaCliente (@conf); end;
El error es el siguiente: Access violation at Address XXXXX in module MSVCRT.DLL. Read of addres XXXXX.
No se en que ando mal, si alguien detecta que estoy mal en algo por favor hágamelo saber. Necesito de vuestra ayuda. Gracias de antemano.