Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Loadpackage / GetClass Problem unter XE6
TomR - Mo 08.09.14 21:23
Titel: Loadpackage / GetClass Problem unter XE6
Hallo,
ich habe ein Problem mit dem (dyn.) Einlesen einer BPL Datei unter Delphi XE6.
Unter D2010 funktionierte es jahrelang problemlos, ich sehe aber nicht, was sich daran geändert haben könnte...
Hier der Source:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| AdressenpackageModule := LoadPackage(ExtractFilePath(Paramstr(0))+'Glorisframes.bpl'); if AdressenpackageModule <> 0 then begin AClass := GetClass('Tfrm_Adressen_Individual'); if AClass = nil then Begin ShowMessage('"Tfrm_Adressen_Individual" ist nicht in Glorisframes.bpl enthalten.'); End; end; |
Das "LoadPackage" gibt einen Wert <> 0 heraus, funktioniert also. Jedoch liefert das "GetClass" "NIL" zurück, obwohl in dem Package ein Frame dieses Namens existiert.
Hier der Source des Packages:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| package Glorisframes; {$R *.res} {$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} {$ALIGN 8} {$ASSERTIONS ON} {$BOOLEVAL OFF} {$DEBUGINFO ON} {$EXTENDEDSYNTAX ON} {$IMPORTEDDATA ON} {$IOCHECKS ON} {$LOCALSYMBOLS ON} {$LONGSTRINGS ON} {$OPENSTRINGS ON} {$OPTIMIZATION OFF} {$OVERFLOWCHECKS OFF} {$RANGECHECKS OFF} {$REFERENCEINFO ON} {$SAFEDIVIDE OFF} {$STACKFRAMES ON} {$TYPEDADDRESS OFF} {$VARSTRINGCHECKS ON} {$WRITEABLECONST ON} {$MINENUMSIZE 1} {$IMAGEBASE $400000} {$DEFINE DEBUG} {$ENDIF IMPLICITBUILDING} {$RUNONLY} {$IMPLICITBUILD OFF} requires doa41dxe6, RaizeComponentsVcl; contains Adressenframe in 'Adressenframe.pas' ; end. |
Und hier die wesentlichen Teile des Frames:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| unit Adressenframe; interface uses Windows, Messages, SysUtils, Classes, vcl.Forms, RzLabel, Oracle, Vcl.Controls, Vcl.StdCtrls; type Tfrm_Adressen_Individual = class(TFrame) Label1: TLabel; Label2: TLabel; Label3: TLabel; private Session : TOracleSession; Kundennummer : Integer; published Procedure Initialisieren (Kunde : Integer; mySession : TOracleSession); end; implementation {$R *.DFM}
procedure Tfrm_Adressen_Individual.Initialisieren(Kunde: Integer; mySession : TOracleSession); begin Kundennummer := Kunde; Session := mySession; Label2.Caption := 'Aktuelle Kundennummer : '+InttoStr(Kunde); end; Initialization RegisterClass(Tfrm_Adressen_Individual); Finalization UnRegisterClass(Tfrm_Adressen_Individual); end. |
Hat jemand vielleicht eine Idee, woran das jetzt unter XE6 scheitert, wo es doch "so schön" unter D2010 funktionierte ?
VIELEN DANK für Eure Hilfe !
TomR
jaenicke - Di 09.09.14 05:34
Hast du Laufzeitpackages aktiviert? Ohne geht das nicht.
Den Grund siehst du, wenn du schaust was RegisterClass macht:
Es trägt die Klassen in die globale Variable RegGroups in der Unit System.Classes ein. Diese ist aber nur die gleiche wie in deiner Hauptanwendung, wenn du mit Laufzeitpackages arbeitest.
Sprich du musst dein Package in den Projektoptionen als Laufzeitpackage eintragen und alle weiteren Packages, die gemeinsam genutzte Klassen enthalten, ebenfalls.
TomR - Di 09.09.14 10:06
Oh Mist, ja klar !
hast vollkommen recht. Wie blöd von mir. Hab ja auch nur 2x in die Projektoptionen reingesehen...
Vielen Dank fürs Augenöffnen !!!
Tom
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!