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 11-10-2007
abracadabra abracadabra is offline
Miembro
 
Registrado: jul 2005
Posts: 30
Poder: 0
abracadabra Va por buen camino
uso de función de dll cuyo parametro es un puntero (dirección) a una estructura

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 [-]
   
  //Declaro tipos enumerados:
  enumMes = (enmEnero, enmFebrero);
          enumDia = (enmLunes, enmMartes); 

  //Declaro estructura
  TipoConfiguracion = packed record
  Mes: enumMes;
  Dia: enumDia;
  FilePath: PChar;
  LifeTime: integer;    
  DeleteTime: integer; 
  LibPath: PChar;
  End;
   
  //Declaro un tipo a funcion:
  TiniciaCliente = Function (ptrTipoConfiguracion: pointer): integer; cdecl;
   
  //Creo una variable global del tipo de la función:
  iniciaCliente: TiniciaCliente
                                                  
  //Cargo la librería:
  procedure CargaDll;
  var
  hdll:THandle;   //handle para libreria a cargar
  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);  //en esta linea sale el error
  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.

Última edición por dec fecha: 11-10-2007 a las 19:17:10.
Responder Con Cita
  #2  
Antiguo 12-10-2007
abracadabra abracadabra is offline
Miembro
 
Registrado: jul 2005
Posts: 30
Poder: 0
abracadabra Va por buen camino
Amigos, por suerte encontré la solución. Desde el punto de vista lógico todo estaba bien, el problema es que yo compilaba mi proyecto con una alineación a 8 bytes, cuando he debido compilar el proyecto con una alineación a un byte.
Es decir la dll necesitaba leer la estructura byte por byte y además era necesario enviar la estructura exactamente tal como es, sin embargo mi proyecto enviaba una estructura cuyo tamaño es multiple de ocho ya que la estructura era enviada en bloques de ocho bytes.
Por ejemplo si la estructura pesaba 29 bytes, mi aplicaión enviaba 32 bytes (multiplo de ocho).

Saludos.
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
pasar un puntero a una funcion baby Varios 2 21-05-2007 13:10:22
Puntero a Estructura (Record) jlrbotella OOP 2 05-03-2007 12:39:51
Almacenar la dirección de un puntero en una cadena abracadabra Varios 2 17-11-2006 19:16:18
Direccion de memoria de una funcion camambrini Varios 0 30-07-2004 18:20:05
Direccion de memoria de una funcion cuyo nombre esta en una variable Rudorf Debates 13 31-07-2003 16:31:10


La franja horaria es GMT +2. Ahora son las 07:49:52.


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