AGB  ·  Datenschutz  ·  Impressum  







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

Komponente in DLL auzslagern

Ein Thema von user0 · begonnen am 11. Jun 2007 · letzter Beitrag vom 15. Jun 2007
Antwort Antwort
user0

Registriert seit: 28. Okt 2005
25 Beiträge
 
Delphi 7 Personal
 
#1

Komponente in DLL auzslagern

  Alt 11. Jun 2007, 14:03
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:
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.
Formular:
Delphi-Quellcode:
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.
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:

self.MaterialLib := get_matLib(); Eigentlich sollte doch jetzt das weitere Programm gar nicht merken, dass die Komponente nicht auf dem Formblatt liegt?
Trotzdem kommt bei einer Zuweisung ("FF.Material := MaterialLib.Materials.GetLibMaterialByName('MarkedCase').Material; ") eine Fehlermeldung: "Can not assign TGLMaterialLibrary to a TGLMaterialLibrary". Die Assign-methode ist aber im GLScene Package für solche Objekte definiert.

Wo liegt der Fehler? Oder gibt es eine bessere Möglichkeit eine Komponente von einem Formular in eine extra DLL oder Ressource auszulagern?

user0
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Komponente in DLL auzslagern

  Alt 11. Jun 2007, 14:11
Verwende Laufzeitpackages. Ansonsten geht das nicht!
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.944 Beiträge
 
Delphi 12 Athens
 
#3

Re: Komponente in DLL auzslagern

  Alt 11. Jun 2007, 17:37
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.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
user0

Registriert seit: 28. Okt 2005
25 Beiträge
 
Delphi 7 Personal
 
#4

Re: Komponente in DLL auzslagern

  Alt 12. Jun 2007, 09:31
Zitat von Bernhard Geyer:
Verwende Laufzeitpackages. Ansonsten geht das nicht!
Meinst du, ich soll GLScene als Laufzeitpackage compilieren? Oder das ganze Formular, dass von der Language suite nicht übersetzt werden kann als neues Package erstellen und zur laufzeit einbinden?
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Komponente in DLL auzslagern

  Alt 12. Jun 2007, 09:40
Zitat von user0:
Meinst du, ich soll GLScene als Laufzeitpackage compilieren? Oder das ganze Formular, dass von der Language suite nicht übersetzt werden kann als neues Package erstellen und zur laufzeit einbinden?
Deine Exe und die DLL's müssen mit Laufzeitpackages erstellt werden! Ob nun GLScene oder dein Formular als BPL oder als "normale" DLL compilert wird ist dann nicht mehr so relevant. Wichtig ist das beide (Exe und DLL/BPL) die gleichen BPL's laden um sie als gemeinsame Klassenbibliothek verwenden zu können.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
user0

Registriert seit: 28. Okt 2005
25 Beiträge
 
Delphi 7 Personal
 
#6

Re: Komponente in DLL auzslagern

  Alt 13. Jun 2007, 10:21
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)?
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Komponente in DLL auzslagern

  Alt 13. Jun 2007, 10:28
Zitat von user0:
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?
Suche bitte hier in der DP nach Hier im Forum suchenDLL Objekte, Hier im Forum suchenDLL Packages und Hier im Forum suchenDLL Interfaces.
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.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
user0

Registriert seit: 28. Okt 2005
25 Beiträge
 
Delphi 7 Personal
 
#8

Re: Komponente in DLL auzslagern

  Alt 13. Jun 2007, 13:18
Sorry. Habe gestern offenbar nicht richtig gesucht.
Die Antwort ist also "Ja, dass geht nicht!".
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Komponente in DLL auzslagern

  Alt 13. Jun 2007, 15:32
Zitat von user0:
Sorry. Habe gestern offenbar nicht richtig gesucht.
Die Antwort ist also "Ja, dass geht nicht!".
Naja, zumindest nicht direkt.
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.
Angehängte Dateien
Dateityp: zip dll_objects_156.zip (16,6 KB, 24x aufgerufen)
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
user0

Registriert seit: 28. Okt 2005
25 Beiträge
 
Delphi 7 Personal
 
#10

Re: Komponente in DLL auzslagern

  Alt 15. Jun 2007, 09:10
Ich denke, ich versteh´s jetzt besser.

Vielen Dank für deine Mühe.

user0
  Mit Zitat antworten Zitat
Antwort Antwort


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 18:57 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