![]() |
Pointer auf Oberklassen
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:
Und dann mein Hauptprogramm:
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.
Delphi-Quellcode:
Die Init-Funktion funktioniert Problemlos, nur führt jeder Zugriff auf das qrmain-Objekt zu einer Schutzverletzung.
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; Warum? Und wie kann ich das ändern? Grüße TO |
Re: Pointer auf Oberklassen
sollte das:
Zitat:
Zitat:
cu waba |
Re: Pointer auf Oberklassen
Shit, Fehler gemacht, habe mich oben verschrieben, ist jetzt editiert. Ich würde gerne einen Pointer übergeben und auf Hauptanwednungsseite wieder ein Query draus machen.
|
Re: Pointer auf Oberklassen
Du erzeugst mit:
Zitat:
cu waba |
Re: Pointer auf Oberklassen
Danke für den Hinweis, bringt allerdings garnicht, der Fehler bleibt erhalten.
Ich habe jetzt diesen code hier: DLL:
Delphi-Quellcode:
Hauptprogramm:
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; exports dll_initdatabase,dll_getquery; begin end.
Delphi-Quellcode:
Weißt du, oder jemand anderes woran es liegt?
var qrmain: TQuery;
procedure dll_initdatabase; external 'database.dll'; function dll_getquery:pointer; external 'database.dll'; procedure initdatabase; begin; //Creates dll_initdatabase; qrmain := TQuery(dll_getquery); end; |
Re: Pointer auf Oberklassen
Und es scheint auch egal ob ich schreibe
qrmain := dll_getquery; oder qrmain := TQuery(dll_getquery); |
Re: Pointer auf Oberklassen
Weiß da niemand was?!?! Würde mir echt helfen!
|
Re: Pointer auf Oberklassen
Versuch mal, den Pointer zu dereferenzieren:
Code:
qrmain := dll_getquery^;
|
Re: Pointer auf Oberklassen
Get leider nicht, wenn ich mache:
qrmain := dll_getquery^; dann mault der compiler
Code:
Wenn ich dagegen mache:
[Fehler] database.pas(34): Inkompatible Typen: 'TQuery' und 'procedure, untyped pointer or untyped parameter'
qrmain := TQuery(dll_getquery^); dann compiled er zwar, aber es kommt wieder ein Schutzverletzung! |
Re: Pointer auf Oberklassen
Äh.. ja:
in der DLL hast Du eine TIBQuery, und Du castest einen Pointer auf ein TIBQuery dereferenzierend auf ein TQuery. TQuery und TIBQuery sind aber nicht mit einander kompatibel. Du müsstest Dich schon entscheiden, ob Du nun mit Interbase oder einem 'normalen' Query arbeiten willst. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz