Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi VCL von Prog und DLL verbinden. (https://www.delphipraxis.net/72623-vcl-von-prog-und-dll-verbinden.html)

schu-r 4. Jul 2006 08:59


VCL von Prog und DLL verbinden.
 
Hallo !

Habe ein Programm und eine DLL
beide werden ohne Laufzeitpackages erstellt.

Problem: Beide instanzieren selbständig eine VCL.
Ist es irgendwie möglich dem DLL zu sagen, dass er die VCL des Hauptprogramms verwenden soll?

Wenn ich die vcl als Laufzeitpackage angebe, dann funkt es, aber das ist für uns keine gute lösung.
Kann mit der DLL Objekte und Formen austauschen nur Steuerelement die im Dll erzeugt wurden werden in einer Form des Hauptprogrammes nicht angezeigt.
Dll wird dynamisch geladen.
D7

Danke!

Bernhard Geyer 4. Jul 2006 09:05

Re: VCL von Prog und DLL verbinden.
 
Die Lösung um die VCL von Exe und DLL zu "verbinden" sind Laufzeitpackages. Es gibt für das "Verbinden" keine andere Lösung.

Was du machen kannst ist zu versuchen mit Win32-API-Mitteln die Steuerelemente/Panels von der DLL in die Exe zu bekommen. Ein objektorientiertes einfügen mit Hilfe der VCL ist nicht möglich bzw. mit sehr viel Problemen verbunden (gleiche Compilerversion, keine Is/As-Abfragen sondern harte Casts, ....)

schu-r 4. Jul 2006 09:08

Re: VCL von Prog und DLL verbinden.
 
Würde mir reichen. Habe immer den gleichen Compiler. Soll ja nur für internes customizing unserer Produkte sein.
Wir liefern das Programm einmal mit der mal mit einer anderen DLL aus.
(keine frei zugängliche Schnittstelle)

xaromz 4. Jul 2006 09:18

Re: VCL von Prog und DLL verbinden.
 
Hallo,

wenn es darum geht, nur ein paar Controls zu verwenden, dann kannst Du im Hauptprogramm Funktionen bereitstellen, die Dir diese Controls erstellen. Quasi eine VCL-Factory.
Etwa so:
Delphi-Quellcode:
funtion CreateButton: TButton;
begin
  Result := TButton.Create(nil);
end;
Wenn Du dann nur mit den so erzeugten Controls arbeitest, müsste IMHO die VCL des Hauptprogramms verwendet werden.
Das ist aber nur praktikabel, solange Du nur wenige Controls benötigst und wenn Du keine Casts benötigst.

Da ich das nicht getestet, sondern nur wild rumgeraten habe, solltest Du das vorher mal ausprobieren.

Gruß
xaromz

schu-r 4. Jul 2006 09:26

Re: VCL von Prog und DLL verbinden.
 
Diese Möglichkeit steht mir immer noch als alternative zur verfügung.
Im Hauptprogramm alles Grafische mit Daten aus dem DLL erstellen und auf Events im DLL reagieren.

Doch wie könnte ich aus der DLL ein Event im Hauptprogramm genereieren, der es auffordert ein Objekt zu erzeugen und mir zu geben?

xaromz 4. Jul 2006 10:27

Re: VCL von Prog und DLL verbinden.
 
Hallo,
Zitat:

Zitat von schu-r
Doch wie könnte ich aus der DLL ein Event im Hauptprogramm genereieren, der es auffordert ein Objekt zu erzeugen und mir zu geben?

Ist doch ganz einfach. Du übergibst der DLL die Prozeduradresse und die DLL ruft dann die Prozedur auf.
Besser wäre es aber, Du erstellst eine Klasse, die alle möglichen Objekte erzeugen kann, und übergibst das als Interface an die DLL.
z. B. so:

Interface-Unit (in Hauptprogramm und DLL verwenden):
Delphi-Quellcode:
type
  IVCLFactory = interface(IInterface)
    function GetButton: TButton;
    function GetLabel: TLabel;
  ...
  end;
Im Hauptprogramm:
Delphi-Quellcode:
type
  TVCLFactory = class(TInterfacedObject, IVCLFactory)
    function GetButton: TButton;
    function GetLabel: TLabel;
  ...
  end;
Beim Laden der DLL übergibst Du dann einfach das Interface:
Delphi-Quellcode:
var
  Factory: IVCLFactory;
begin
  Factory := TVCLFactory.Create;
  // DLL laden
  InitDLL(Factory); // <- hier eine exportierte Funktion aufrufen, der das Interface übergeben wird
end;
So würde ich das machen. Nicht vergessen, am Schluss in der DLL das Interface freizugeben (nil zuweisen).

Gruß
xaromz

schu-r 4. Jul 2006 11:53

Re: VCL von Prog und DLL verbinden.
 
Hab gerade sowas in der Art gebastelt.

Lieber aber währ mir die Möglichkeit einen TFrame im Plugin zu Zeichnen und in der Form (hauptprogramm) darzustellen. Da funkt mir aber die VCL dazwischen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:54 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