Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Error al usar una dll que he creado (https://www.clubdelphi.com/foros/showthread.php?t=38014)

DISIMULA 29-11-2006 18:02:02

Error al usar una dll que he creado
 
Bueno para empezar indicar que es la primera dll que creo para uso propio y por ser la primera pues empiezan los problemas.

indico la funcion que me da problemas de la dll es la siguiente.

Código Delphi [-]
Procedure ConectarAdo(ADOConnection1: TADOConnection; Nombre: String); stdcall; export;
Begin
  ADOConnection1.Connected:=False;
  ADOConnection1.ConnectionString:=
  'Provider=Microsoft.Jet.OLEDB.4.0;'+
  'Data Source='+ExtractFilePath(Application.ExeName)+Nombre+
  ';Persist Security Info=False';
  Try ADOConnection1.Connected:=True
  Except
  Begin
     Showmessage('No ha sido posible realizar la conexion');
  end;
  end;
end;

exports ConectarAdo


Ahora el codigo de llamada que uso en el ejemplo uso un form con un TADOConecction y la siguiente llamada:

Código Delphi [-]
var
  Form1: TForm1;
  Procedure ConectarAdo(ADOConnection1: TADOConnection; Nombre:    String); external 'info.dll';

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  ConectarAdo(AdoC,'Ejemplo.mdb');
end;


Pues cuando pruebo me da una excepcion EAccessViolation in module info.dll at 001484FA

Alguien puede ayudarme seguro que es una tonteria pero es que no estoy muy puesto, :p

Gracias por todo.

Caral 29-11-2006 20:44:53

Hola DISIMULA
No se si me equivoco, pero veo algunas diferencias de sintaxis, podrian ser el problema, no se, pruebalo asi:
Código Delphi [-]
Procedure ConectarAdo(ADOConnection1: TADOConnection; Nombre: String); stdcall; export;
Begin
  ADOConnection1.Connected:=False;
  ADOConnection1.ConnectionString:=
  'Provider=Microsoft.Jet.OLEDB.4.0;'+
  'Data Source='+ExtractFilePath(Application.ExeName)+Nombre+';'+
  'Persist Security Info=False';
  Try ADOConnection1.Connected:=True
  Except
  Begin
     Showmessage('No ha sido posible realizar la conexion');
  end;
  end;
end;

exports ConectarAdo
y este otro:
Código Delphi [-]
var
  Form1: TForm1;
  Procedure ConectarAdo(ADOConnection1: TADOConnection; Nombre:    String); external 'info.dll';

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  ConectarAdo(ADOConnection1,'Ejemplo.mdb');
end;
y si tiene clave la base de datos, por ejemplo: Clave admin
Código Delphi [-]
Procedure ConectarAdo(ADOConnection1: TADOConnection; Nombre: String); stdcall; export;
Begin
  ADOConnection1.Connected:=False;
  ADOConnection1.ConnectionString:=
  'Provider=Microsoft.Jet.OLEDB.4.0;'+
  'Data Source='+ExtractFilePath(Application.ExeName)+Nombre+';'+
  'Persist Security Info=False;'+
  'Jet OLEDB: Database Password=admin';
  Try ADOConnection1.Connected:=True
  Except
  Begin
     Showmessage('No ha sido posible realizar la conexion');
  end;
  end;
end;

exports ConectarAdo
Tal vez ayude en algo, aunque prefiero un archivo ini al que pueda cambiar la direccion de la base de datos, con un dll, queda solo en un sitio, ademas de tener que distribuir el dll, con el programa, bueno, es una opinion nada mas.
Saludos

DISIMULA 02-12-2006 20:01:40

Gracias Caral acabo de probar y nada sigo con el mismo error, se ve que no es esa del todo la solución se os ocurre alguna otra cosa.

Posdata: no lo pongo en un ini por que es una dll con mas funciones relacionadas para despues usarlas en mis programas. :p

Gracias por responder.

poliburro 02-12-2006 21:51:40

El problema que tienes radica en dos partes

La primera es que Cuando creas Dlls que serán utilizadas por diferentes lenguajes (lo menciono por tu sentencia StdCall), no podrás utilizar Tipos String, por lo que deberas usar Pchar, y despúes en el código de delphi cuando haces la declaración de la función debes agregarle por igual la sentencia StdCall.


Código Delphi [-]
Procedure ConectarAdo(ADOConnection1: TADOConnection; Nombre:    String); StdCall; external 'info.dll';

Suerte

roman 02-12-2006 21:59:50

También puede usar el tipo ShortSring. Tiene la limitante de 256 caracteres pero en muchos casos es más que suficiente y con la ventaja de no tener que ocuparnos del manejo de memoria como en el caso de los PChar.

// Saludo

DISIMULA 03-12-2006 12:58:34

Pues dicho y hecho Poliburro tenias razón me faltaba el stdcall en la declaración de la función, ya funciono todo y como decia tambien Roman pues use el ShortString y todo ha ido sobre rueda.

Gracias a todos los que me habeis ayudado.


La franja horaria es GMT +2. Ahora son las 01:47:26.

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