ozsWizzard
26-07-2012, 15:18:34
Hola, muy buenas a todos.
Pongo la duda en el hilo de varios porque es un conjunto de cosas y, aunque tengo muy acotado el error, no sé si es exactamente por eso. Bueno, explico:
Con Rad Studio XE2 Delphi Update 1.
He creado un proyecto dll que tiene un procedimiento que conecta con BDD(base de datos), utilizo dbexpress con SqlServer 2005, mediante un TSQLConnection.
Desde otro programa llamo a dicho procedimiento y, en principio, funciona correctamente. El problema viene cuando salgo de este programa, que me da el siguiente error 'access violation at 0x0643e187: read of adress 0x065967f4' y le doy a continuar y me aparece de manera indefinida (hasta que haga ctrl + F2) el siguiente error (con el mismo tipo de excepción C$00000005) 'access violation at 0x02895dd2: read of adress 0x046c8648'.
Sé que con los mensajes de error no se sabe cual es el problema, pero pongo todo por si acaso, sé que son errores de acceso a memoria, pero no sé por donde puede venir.
Pruebas y más información:
1.- Desde la dll se abre un formulario. He probado a abrir el formulario y no hay problema, es sólo cuando hago un "conex.conected(TSQLConnection) := true". Después me aseguro de cerrar la conexión y todo, pero nada, peta.
principal dll
library MyDll;
{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
uses
System.SysUtils,
System.Classes,
Forms,
Dialogs,
uFrm in 'forms\uFrm.pas' {Frm};
procedure Llamada (Host, BDD: String); stdcall;
var
f: TFrm;
begin
f := TFrm.Create(Application, Host, BDD);
try
f.Mostrar;
finally
f.Free;
end;
end;
exports Llamada;
begin
end.
Frm de la dll
unit uFrm;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ImgList,
Vcl.StdCtrls, Vcl.Buttons, Vcl.ComCtrls, sListView, Vcl.ExtCtrls,
Data.DBXMSSQL, Data.DB, Data.SqlExpr;
type
TFrm = class(TForm)
Conex: TSQLConnection;
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
Conectado: Boolean;
function Mostrar: Boolean;
constructor Create(AOWner: TComponent; pHost, pBDD: String); Reintroduce;
end;
var
Frm: TFrm;
implementation
{$R *.dfm}
{ TFrm }
constructor TFrm.Create(AOWner: TComponent; pHost, pBDD: String);
Var
Res: Integer;
begin
inherited Create(AOwner);
Conectado := false;
repeat
Conex.Params.Values['HostName'] := pHost;
Conex.Params.Values['DataBase'] := pBDD;
Conex.Params.Values['User_Name']:='usu';
Conex.Params.Values['Password']:='pass';
try
Conex.Connected := true;
Conectado := true;
except
Res := MessageDlg('No se ha podido conectar con BDD!',
mtError, [mbCancel, mbRetry], 0);
end;
until (Res <> 5);
end;
procedure TFrm.FormDestroy(Sender: TObject);
begin
Conex.Connected := false;
end;
function TFrm.Mostrar: Boolean;
begin
if Conectado then
ShowModal;
end;
end.
Pongo la duda en el hilo de varios porque es un conjunto de cosas y, aunque tengo muy acotado el error, no sé si es exactamente por eso. Bueno, explico:
Con Rad Studio XE2 Delphi Update 1.
He creado un proyecto dll que tiene un procedimiento que conecta con BDD(base de datos), utilizo dbexpress con SqlServer 2005, mediante un TSQLConnection.
Desde otro programa llamo a dicho procedimiento y, en principio, funciona correctamente. El problema viene cuando salgo de este programa, que me da el siguiente error 'access violation at 0x0643e187: read of adress 0x065967f4' y le doy a continuar y me aparece de manera indefinida (hasta que haga ctrl + F2) el siguiente error (con el mismo tipo de excepción C$00000005) 'access violation at 0x02895dd2: read of adress 0x046c8648'.
Sé que con los mensajes de error no se sabe cual es el problema, pero pongo todo por si acaso, sé que son errores de acceso a memoria, pero no sé por donde puede venir.
Pruebas y más información:
1.- Desde la dll se abre un formulario. He probado a abrir el formulario y no hay problema, es sólo cuando hago un "conex.conected(TSQLConnection) := true". Después me aseguro de cerrar la conexión y todo, pero nada, peta.
principal dll
library MyDll;
{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
uses
System.SysUtils,
System.Classes,
Forms,
Dialogs,
uFrm in 'forms\uFrm.pas' {Frm};
procedure Llamada (Host, BDD: String); stdcall;
var
f: TFrm;
begin
f := TFrm.Create(Application, Host, BDD);
try
f.Mostrar;
finally
f.Free;
end;
end;
exports Llamada;
begin
end.
Frm de la dll
unit uFrm;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ImgList,
Vcl.StdCtrls, Vcl.Buttons, Vcl.ComCtrls, sListView, Vcl.ExtCtrls,
Data.DBXMSSQL, Data.DB, Data.SqlExpr;
type
TFrm = class(TForm)
Conex: TSQLConnection;
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
Conectado: Boolean;
function Mostrar: Boolean;
constructor Create(AOWner: TComponent; pHost, pBDD: String); Reintroduce;
end;
var
Frm: TFrm;
implementation
{$R *.dfm}
{ TFrm }
constructor TFrm.Create(AOWner: TComponent; pHost, pBDD: String);
Var
Res: Integer;
begin
inherited Create(AOwner);
Conectado := false;
repeat
Conex.Params.Values['HostName'] := pHost;
Conex.Params.Values['DataBase'] := pBDD;
Conex.Params.Values['User_Name']:='usu';
Conex.Params.Values['Password']:='pass';
try
Conex.Connected := true;
Conectado := true;
except
Res := MessageDlg('No se ha podido conectar con BDD!',
mtError, [mbCancel, mbRetry], 0);
end;
until (Res <> 5);
end;
procedure TFrm.FormDestroy(Sender: TObject);
begin
Conex.Connected := false;
end;
function TFrm.Mostrar: Boolean;
begin
if Conectado then
ShowModal;
end;
end.