![]() |
Komponente in DLL auzslagern
Hallo leute,
ich arbeite an einem größeren Softwareprojekt. Ein Formular enthält eine Komponente (TGLMaterialLibrary vom GLScene-Package), dass nicht von der Language-Suite compiliert werden kann. Ich versuche nun diese Komponente auf ein Formular in einer DLL zu kopieren, und diese zur Laufzeit des Programms aus der DLL zu laden. Hier der Code der DLL: Hauptprogramm:
Delphi-Quellcode:
Formular:
library MatLibDll;
{ Important note about DLL memory management: ShareMem must be the first unit in your library's USES clause AND your project's (select Project-View Source) USES clause if your DLL exports any procedures or functions that pass strings as parameters or function results. This applies to all strings passed to and from your DLL--even those that are nested in records and classes. ShareMem is the interface unit to the BORLNDMM.DLL shared memory manager, which must be deployed along with your DLL. To avoid using BORLNDMM.DLL, pass string information using PChar or ShortString parameters. } uses ShareMem, SysUtils, Classes, formular in 'formular.pas' {Form1}; exports get_matLib; {$R *.RES} var exitProc_save: pointer; procedure MyExit(); begin if Assigned(Form1) then begin Form1.Close; Form1.Free; end; ExitProc := exitProc_save; end; begin exitProc_save := @ExitProc; ExitProc := @MyExit; Form1 := TForm1.Create(nil); Form1.Show; end.
Delphi-Quellcode:
Im eigentlichen Programm wird die DLL Statisch geladen. Die "fehlerhafte" Komponente habe ich im Designer gelöscht, und die Eigenschaft im Code wider hinzugefügt. Bei FormCreate wird dann folgendes gemacht:
unit formular;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, GLMisc, GLTexture; type PGLMaterialLibrary = ^TGLMaterialLibrary; type TForm1 = class(TForm) MaterialLib: TGLMaterialLibrary; private { Private declarations } public { Public declarations } end; var Form1: TForm1; function get_matLib(): TGLMaterialLibrary; stdcall; implementation {$R *.DFM} function get_matLib(): TGLMaterialLibrary; begin if not Assigned(Form1) then Form1 := TForm1.Create(nil); result := Form1.MaterialLib; end; end.
Delphi-Quellcode:
Eigentlich sollte doch jetzt das weitere Programm gar nicht merken, dass die Komponente nicht auf dem Formblatt liegt?
self.MaterialLib := get_matLib();
Trotzdem kommt bei einer Zuweisung ("
Delphi-Quellcode:
") eine Fehlermeldung: "Can not assign TGLMaterialLibrary to a TGLMaterialLibrary". Die Assign-methode ist aber im GLScene Package für solche Objekte definiert.
FF.Material := MaterialLib.Materials.GetLibMaterialByName('MarkedCase').Material;
Wo liegt der Fehler? Oder gibt es eine bessere Möglichkeit eine Komponente von einem Formular in eine extra DLL oder Ressource auszulagern? user0 |
Re: Komponente in DLL auzslagern
Verwende Laufzeitpackages. Ansonsten geht das nicht!
|
Re: Komponente in DLL auzslagern
Die DLL hat eigene RTTI. deshalb kann der "is" operator nicht über DLL Grenzen Hinweg funktionieren.
In Assign von tpersistent nachfahren z.b. Wird aber immer mit dem is Operator verglichen ob das übergebene Objekt von gleichen Typ oder vom allgemeineren Typ ist. Ich habe dieses Problem bei meinen Anwendunge so gelöst das ich z.b. bei stringlisten nicht assign sondern Clear udn addStrings ausführe. Wenn du den Quellcode hast würde ich ein interface für die Kompenente entwerfen dann sollte es keine Probleme geben. |
Re: Komponente in DLL auzslagern
Zitat:
|
Re: Komponente in DLL auzslagern
Zitat:
|
Re: Komponente in DLL auzslagern
:coder2: Damit ich das richtig verstehe: Es ist nicht möglich, eine komponente eines Programms in eine externe Datei (DLL / dpk) zu packen und sie zur Laufzeit in das Hauptprogramm zu kopieren, ohne Laufzeitpackages zu verwenden (einzelnes kopieren der Eigenschaften währe zu aufwendig)?
|
Re: Komponente in DLL auzslagern
Zitat:
![]() ![]() ![]() Das wurde schon seeeehr oft besprochen, falls du dann noch Fragen hast, komm' einfach hierher (diesen Thread) zurück. Aber lies dir bitte die anderen Threads durch. |
Re: Komponente in DLL auzslagern
Sorry. Habe gestern offenbar nicht richtig gesucht.
Die Antwort ist also "Ja, dass geht nicht!". :? |
Re: Komponente in DLL auzslagern
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Du kannst Objekte entweder in flache, exportierte Funktionen verpacken, die den Zeiger auf das Objekt entweder zurückgeben, oder als Parameter kriegen. (So wie die Handles aus der WinAPI) Oder du benutzt Interfaces, die du in der DLL implementierst, und als Interface in der Echse benutzen kannst. Ich habe mal ein Archiv mit 2 Projektgruppen angehängt, die das hoffentlich einfach genug illustrieren. :) |
Re: Komponente in DLL auzslagern
Ich denke, ich versteh´s jetzt besser.
Vielen Dank für deine Mühe. :thumb: user0 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:22 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