Autor Beitrag
Hirschi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22

Win XP, Vista, 7
Delphi 2009 Ent., C# (VS 2010 Ent.), C++ (VS 2010 Ent.), Java (Eclipse)
BeitragVerfasst: Fr 17.07.09 09:41 
Hallo Experten,
folgendes, kleines Problem:
Meine Anwendung soll dynamisch verschiedene BPLs beim Start laden. Mit einer klappt das auch wunderbar. Will ich nun in einer Schleife Package für Package laden, bekomme ich schon ab dem 2. Package folgende Fehlermeldung:
"Im Projekt XXXXX.exe ist eine Exception der Klasse EPackageError mit der Meldung 'Package 'XYZ1 kann nicht geladen werden.' Es enthält die Unit 'UnitTest,'die auch im Package 'XYZ2' enthalten ist' aufgetreten."

Meine erste Vermutung war, dass es vielleicht daran liegen könnte, dass ich jedes Package auf das selbe "HModule" lade. Also habe ich mir ein Array solcher Handles gemacht. Dennoch bleibt der Fehler.

Der ist ja erstmal recht eindeutig. Nur versteh ich den Sinn dahinter nicht. Jedes meiner Packages muss die angemeckerte Unit enthalten, um die Unabhängikeit zu gewährleisten, damit eine Anwendung eben nur die BPLs reinläd und fertig. Würde ich diese Unit zum Beispiel der Anwendung mitgeben, die die BPLs läd, müsste ich das auch für alle anderen Anwendungen machen, weil sonst die Packages nicht funktionieren. Wäre doch dann sinnlos, oder? Oder anders gesagt, wenn jedes Package eine Form enthält und damit die Unit Forms braucht, würde ich ja den gleichen Fehler bekommen. Um das zu umgehen müsste die Host-Anwendung Forms enthalten, selbst wenn's nur eine Programm für die Kommandozeile ist. Ist doch Mist sowas!

Mit freundlichen Grüßen

Hirschi

PS: Mit "cyclic referencing" kann das doch auch nichts zu tun haben, weil die Packages unabhängig voneinander sind. D.h. ich verweise nirgends von einem Package auf ein anderes.


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Fr 17.07.2009 um 10:15
Hirschi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22

Win XP, Vista, 7
Delphi 2009 Ent., C# (VS 2010 Ent.), C++ (VS 2010 Ent.), Java (Eclipse)
BeitragVerfasst: Di 04.08.09 15:06 
Habe es hinbekommen, auch wenn ich mir der Lösung nicht ganz glücklich bin:
Habe ein Art Basis-Package erstellt und dort alle Units hinzugefügt, die mehrmals verwendet werden. In den anderen Packages habe ich unter Requires dieses Basis-Package hinzugefügt, damit diese es verwenden können.

Habe auch noch gesehen - aber nicht hinbekommen - dass man BPLs mittels LoadLibrary wie eine DLL laden kann. In dem Fall müsste es egal sein, ob Units in anderen BPLs schon verwendet werden, oder?

MfG
Hirschi
HelgeLange
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: Di 04.08.09 20:16 
Wenn Du Packages dynamisch lädst, dann muss alles eindeutig sein, heisst dass eine Unit kann nicht in 2 packages gleichzeitig sein. Wenn Du sie in beiden brauchst, dann musst Du ein Basis-Paket machen, welches beide dann einbinden. Oder Du bindest sie in eins ein und lässt das zweite einfach das andere benutzen. Also Dein Lösungsweg war schon der korrekte und es geht einfach nicht anders. Denn wie sonst soll dein Dein programm (welches die Packages lädt) wissen, welche UnitTest.pas benutzt werden soll, die aus Package 1 oder 2 ?

_________________
"Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw