Hallo Leute
ich möchte ein Teil meiner Anwendung (Datenbank-Zugriff) in eine
DLL auslagern um ihn einfacher austauschbar zu machen. Ich brauche in meinem Hauptprogramm ein TQuery (qrmain) um auf die Datenbankfelder zuzugreifen und um Queries auszuführen. Eine
DLL-Funktion soll intern ein eigenes
Query-Objekt erstellen und auf Befehl einen Pointer auf dieses zurückgeben. Soweit so gut, jetzt scheitert die Sache aber an einer Schutzverletzung. Das hat vermutlich seinen Grund darin, das in der
DLL je nach Datenbank in TIBQuery erstellt wird, ich aber in meinem Hauptprogramm nur ein TQuery erwarte.
Jetzt hier mal ein Paar fetzten Code:
erst mal die
DLL:
Delphi-Quellcode:
library database;
uses
IBCustomDataSet,
IBQuery,
IBDatabase,
inifiles,
dialogs,
IBServices;
var qrmain: TIBQuery;
trmain: TIBTransaction;
dbmain: TIBDatabase;
{$R *.res}
procedure dll_initdatabase;
var ini:TInifile;
begin;
ini := TInIfile.Create('./config.ini');
try
dbmain := TIBDatabase.Create(nil);
trmain := TIBTransaction.Create(nil);
qrmain := TIBQuery.Create(nil);
dbmain.LoginPrompt := false;
dbmain.DefaultTransaction := trmain;
dbmain.IdleTimer := 0;
dbmain.AllowStreamedConnected := false;
trmain.DefaultDatabase := dbmain;
trmain.Params.Add('concurrency');
trmain.Params.Add('nowait');
trmain.AutoStopAction := saNone;
qrmain.Database := dbmain;
qrmain.Transaction := trmain;
qrmain.CachedUpdates := false;
dbmain.DatabaseName := ini.ReadString('database','databasename','');
dbmain.SQLDialect := ini.ReadInteger('database','sqldialect',3);
dbmain.Params.Text :=
'password='+ini.ReadString('database','password','')+#10#13+
'lc_ctype='+ini.ReadString('database','charset','')+#10#13+
'user_name='+ini.ReadString('database','user_name','');
dbmain.Connected := true;
trmain.Active := true;
finally
ini.Free;
end;
end;
function dll_getquery:pointer;
begin;
result:= @qrmain;
end;
procedure dll_commit;
begin;
if trmain.intransaction then trmain.Commit;
Trmain.StartTransaction;
end;
exports dll_initdatabase,dll_getquery,dll_commit;
begin
end.
Und dann mein Hauptprogramm:
Delphi-Quellcode:
var qrmain: TQuery;
procedure dll_initdatabase; external 'database.dll';
function dll_getquery:TQuery; external 'database.dll';
procedure dll_commit; external 'database.dll';
implementation
procedure initdatabase;
begin;
//Creates
dll_initdatabase;
qrmain := TQuery(dll_getquery);
end;
procedure execquery(str:AnsiString;passv:boolean);
begin;
inc(c);
qrmain.Close;
qrmain.SQL.Clear;
qrmain.SQL.Add(str);
if (passv) then qrmain.Open
else qrmain.ExecSQL;
end;
procedure commit;
begin;
dll_commit;
end;
Die Init-Funktion funktioniert Problemlos, nur führt jeder Zugriff auf das qrmain-Objekt zu einer Schutzverletzung.
Warum? Und wie kann ich das ändern?
Grüße
TO