AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Pointer auf Oberklassen

Ein Thema von theomega · begonnen am 15. Sep 2003 · letzter Beitrag vom 16. Sep 2003
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von theomega
theomega

Registriert seit: 18. Jun 2002
684 Beiträge
 
#1

Pointer auf Oberklassen

  Alt 15. Sep 2003, 16:35
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
  Mit Zitat antworten Zitat
aogwaba

Registriert seit: 21. Aug 2003
16 Beiträge
 
#2

Re: Pointer auf Oberklassen

  Alt 15. Sep 2003, 18:48
sollte das:
Zitat:
function dll_getquery:TQuery;
begin;
result:= @qrmain;
end;
nicht so:
Zitat:
function dll_getquery:TQuery;
begin;
result:= qrmain;
end;
lauten.

cu
waba
  Mit Zitat antworten Zitat
Benutzerbild von theomega
theomega

Registriert seit: 18. Jun 2002
684 Beiträge
 
#3

Re: Pointer auf Oberklassen

  Alt 15. Sep 2003, 18:54
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.
  Mit Zitat antworten Zitat
aogwaba

Registriert seit: 21. Aug 2003
16 Beiträge
 
#4

Re: Pointer auf Oberklassen

  Alt 15. Sep 2003, 20:56
Du erzeugst mit:
Zitat:
qrmain := TIBQuery.Create(nil);
ein Object der Klasse TIBQuery. 'qrmain' ist ein Zeiger, auf diese TIBQuery-Instanz, der @-Operator kann enfallen.

cu
waba
  Mit Zitat antworten Zitat
Benutzerbild von theomega
theomega

Registriert seit: 18. Jun 2002
684 Beiträge
 
#5

Re: Pointer auf Oberklassen

  Alt 15. Sep 2003, 21:13
Danke für den Hinweis, bringt allerdings garnicht, der Fehler bleibt erhalten.

Ich habe jetzt diesen code hier:

DLL:
Delphi-Quellcode:
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.
Hauptprogramm:

Delphi-Quellcode:
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;
Weißt du, oder jemand anderes woran es liegt?
  Mit Zitat antworten Zitat
Benutzerbild von theomega
theomega

Registriert seit: 18. Jun 2002
684 Beiträge
 
#6

Re: Pointer auf Oberklassen

  Alt 15. Sep 2003, 21:22
Und es scheint auch egal ob ich schreibe
qrmain := dll_getquery;

oder

qrmain := TQuery(dll_getquery);
  Mit Zitat antworten Zitat
Benutzerbild von theomega
theomega

Registriert seit: 18. Jun 2002
684 Beiträge
 
#7

Re: Pointer auf Oberklassen

  Alt 16. Sep 2003, 11:23
Weiß da niemand was?!?! Würde mir echt helfen!
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.640 Beiträge
 
#8

Re: Pointer auf Oberklassen

  Alt 16. Sep 2003, 11:28
Versuch mal, den Pointer zu dereferenzieren:

Code:
qrmain := dll_getquery^;
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von theomega
theomega

Registriert seit: 18. Jun 2002
684 Beiträge
 
#9

Re: Pointer auf Oberklassen

  Alt 16. Sep 2003, 11:35
Get leider nicht, wenn ich mache:
qrmain := dll_getquery^;

dann mault der compiler
Code:
[Fehler] database.pas(34): Inkompatible Typen: 'TQuery' und 'procedure, untyped pointer or untyped parameter'
Wenn ich dagegen mache:
qrmain := TQuery(dll_getquery^);
dann compiled er zwar, aber es kommt wieder ein Schutzverletzung!
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.640 Beiträge
 
#10

Re: Pointer auf Oberklassen

  Alt 16. Sep 2003, 11:41
Ä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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz