Entwickler-Ecke
Dateizugriff - Dynamischer Zugriff auf ZeosLib (als *.bpl Datei)
Böser Wolf - Mi 30.04.08 21:03
Titel: Dynamischer Zugriff auf ZeosLib (als *.bpl Datei)
Hallo miteinander,
ich habe hier ein Problem das mich jetzt doch schon längere Zeit beschäftigt.
Ich versuche über die ZeosLib, die ich als Package im Verzeichnis meiner Anwendung liegen habe, eine Connection zu einer Firebird Datenbank aufzubauen. Doch so weit kommt es immer nicht. Deshalb habe ich das Thema hier rein gepackt und nich zu den Datenbanken.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| procedure TForm2.lesen(); var Path: String; Connection: TComponent;
begin getDir(0,Path); PackageModule := LoadPackage(''+Path+'\ZComponent110.bpl'); if PackageModule = 0 then raise Exception.Create('Das laden von ZComponent.bpl hat nicht geklappt!'); begin AClass := GetClass('TZConnection'); if AClass = nil then raise Exception.Create('Das laden von ZConnection hat nicht geklappt!'); Connection := TComponentClass(AClass).Create(Application); Connection.Database:='Database.FDB' end
end; |
Das ist meine Procedure, die ich geschrieben habe, ansich ja nichts kompliziertes.
Und jetzt mal dazu was alles passiert und vorallem was nicht!
- Er läd das Package und die Klasse TZConnection scheint er auch zu finden.
- Er meckert auch nicht beim erzeugen, also bei ->
"Connection := ZComponentClass(AClass).Create(Application);".
- Aber wenn ich die Property "Database" (oben rot) versuche zu setzen, kann er sie
nicht erkennen.
Jetzt zu den Rahmenbedingungen meine Programms.
Im Package der Zeoslib ist bei TZConnection die"initialize"-Procedure wie folgt geschrieben
Delphi-Quelltext
1: 2:
| initialization RegisterClass(TZConnection); |
In meiner eigenen Unit sind die Variablen:
Delphi-Quelltext
1: 2:
| PackageModule: HModule; AClass: TPersistentClass |
;
weiter oben schon deklariert worden, stehen der procedure also uneingeschränkt zur Verfügung!
Außerdem sind die Properties von ZConnection der ZeosLib alle Public, also müsste das auch kein Problem darstellen.
Im Ereignisprotokolls des Compilers kann ich sehen das die Packages geladen werden,
und AClass hat auch den Wert bzw die Klasse ZConnection.
Ich hatte das auch durch verschiedene Messages, die ich mir anzeigen lassen hab versucht nachzuprüfen und das sah alles eigenlich recht ordentlich aus.
So, ich denke das reicht erst mal, sonst habt ihr ja nichts mehr zu schreiben ;)
Würde mich über eine Anwort mit guten Tips freuen.
Danke schon ma im Voraus, bis dann
Tschö
Moderiert von
matze: Delphi-Tags hinzugefügt
Hirschi - Mi 23.06.10 10:12
Ich habe ein ganz ähnliches Problem, nur ist es keine Property die ich setzten will, sondern eine Methode die ich aufrufen möchte. Diese Methode gehört zu einer Klasse und eine Instanz davon befindet sich in der BPL, die erfolgreich geladen und angezeigt wird.
Bisher bin ich darauf gestoßen, dass man das wohl irgendwie über RTTI-Methoden macht, denn wie man im Beispiel sehen kann weiß das ladende Programm nicht, was für Methoden und Properties es gibt, weil der Typ bzw. die Klasse erst zur Laufzeit geladen wird. Es muss also sowas geben wie:
callMethodfromBPL(Instanz, <Typ>, '<Methodenname>');
MfG
Hirschi
Hirschi - Di 06.07.10 15:06
Ich habe es hinbekommen eine Methode eines Objekts in einer BPL aufzurufen, mit:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| type Txyz = procedure of Object; ... Method :TMethod; xyz :Txyz; ... AClass := GetClass('TFrameSomething'); Method.Code:=AClass.MethodAddress('getString'); Method.Data:=self; xyz:=Txyz(Method); xyz; |
Die Funktion hat aber einen Rückgabewert, wisst ihr, wie ich an den herankomme? Eigentlich müsste ich xyz irgendwie in einen String reinbekommen, weil xyz doch auf den Rückgabewert (in dem Fall ein String) zeigt, oder?
MfG
Hirschi
EDIT: Gelöst, ich muss in der Type-Definition auch "function : string of object" verwenden! :)
Hirschi - Di 06.07.10 17:51
Mist, nun bekomme ich Zugriffsverletzungen, sobald ich auf irgendwas im Objekt zugreifen will. Also wenn der String nicht in der Methode getString erzeugt wird, sondern wenn ich ihn mir aus TFrameSomething.someString hole....wie kann das denn sein?!
Wenn die BPL geladen wird, habe ich ja bereits ein Objekt der Klasse TFrameSomething, was die Methode getString und someString enthält. In meiner Anwendung rufe ich die Methode auf wie oben beschrieben, bekomme aber eine Zugriffsverletzung.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!