Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zugriff von Form auf Komponente der dll ? (https://www.delphipraxis.net/151430-zugriff-von-form-auf-komponente-der-dll.html)

Blamaster 17. Mai 2010 17:57


Zugriff von Form auf Komponente der dll ?
 
Hi,

ich habe eine dll in der 2 Forms eingebunden sind. Nun soll das Form auf die in der libary unit erstellte Komponente xy zugreifen können. Wie funktioniert das ? Im falle einer normalen Unit würde sich diese nun einfachin die Uses der Form aufnehmen, aber wie macht man das bei einer libary ?

Mfg Yannic

mkinzler 17. Mai 2010 18:36

Re: Zugriff von Form auf Komponente der dll ?
 
Es ist nicht möglich Delphi-Objekte im Interface einer Dll zu verwenden. Du musst die Verwaltung vollständig in der dll kapseln und im Interface (flache) Funktionen für den Zugriff deklarieren

Blamaster 17. Mai 2010 21:14

Re: Zugriff von Form auf Komponente der dll ?
 
Hi,

hört sich extrem kompliziert an. Lässt sich das etwas besser umschreiben ?

Die in die Dll eingebundenen Forms enthalten lediglich Buttons sie daraufhin mit einer ComPort Komponente feste Funktion ausführen sollen.

Mfg Yannic

himitsu 17. Mai 2010 21:22

Re: Zugriff von Form auf Komponente der dll ?
 
Es gab in letzer Zeit mehrere Threads zu diesem Thema (VCL in einer DLL),

und man kann grundsätzlich erstmal nur eines sagen:
> die VCL basiert auf Klassen
> und Klassen kann man nicht über Modulgrenzen (EXE oder DLL) hinweg kommunizieren lassen, da jedes Modul seine eigene RTTI besitzt.

dazu kommt dann noch der Speichermanager, wo auch jedes Modul seinen eigenen besitzt.

Mehr dazu (und auch ein paar Lösungen) wurden dort schon mehrfach genannt.
eine Lösung: BPLs (Packages) statt der DLLs

weitere Sachen: Shared Memory (Klassen, Strings, dyn. Arrays werden über den Delphi-Speichermanager verwaltet, weswegen man sie nur schlecht im Verwaltungsbereich eines anderen SpeicherManagers bearbeiten kann)

Blamaster 17. Mai 2010 21:55

Re: Zugriff von Form auf Komponente der dll ?
 
Hi,

aber es soll ja auch garnicht über die Modulgrenzen hinweg kommuniziert werden.

In der Dll selber erstelle ich ein nonvcl Komponente (ComPort Komponente).

Jetzt habe ich noch 2 Forms in die Dll eingebunden.
Eine der beiden Forms hat nun 2 Buttons und beim Klick soll der ComPort senden.

Mfg Yannic

mkinzler 17. Mai 2010 22:00

Re: Zugriff von Form auf Komponente der dll ?
 
Dann funktioniert das genauso wie bei einer Exe.

Blamaster 17. Mai 2010 22:08

Re: Zugriff von Form auf Komponente der dll ?
 
Hi,

die Libary lässt sich aber nicht in die uses der Form aufnehmen.

mkinzler 17. Mai 2010 22:10

Re: Zugriff von Form auf Komponente der dll ?
 
Nein aber diie andere Unit.

himitsu 18. Mai 2010 06:37

Re: Zugriff von Form auf Komponente der dll ?
 
Zitat:

Zitat von Blamaster
aber es soll ja auch garnicht über die Modulgrenzen hinweg kommuniziert werden.

Nicht?
Klang irgendwie anders.
Zitat:

Zitat von Blamaster
ich habe eine dll in der 2 Forms eingebunden sind. Nun soll das Form auf die in der libary unit erstellte Komponente xy zugreifen können.

Gut, wenn die Form auf die Komponente zugreifen soll, dann denkt man erstmal auch an eine VCL-Komponente.
Aber wenn du vom Programmcode (nicht direkt über die Form) zugreifen willst, dann ginge es schon leichter.
Zitat:

Zitat von Blamaster
In der Dll selber erstelle ich ein nonvcl Komponente (ComPort Komponente).

Jetzt habe ich noch 2 Forms in die Dll eingebunden.
Eine der beiden Forms hat nun 2 Buttons und beim Klick soll der ComPort senden.

Und hier klang es eben so, als wenn
eine Form in der EXE
und 2 Forms + Komponente in der DLL
miteinander reden sollen.


Nja, du mußt dir einfach nur eine Schnittstelle aufbauen.
- Also einen Satz von Funktionen/Prozeduren, in der DLL, mit welchen man die Komonente ansteuert
- diese Funktionen werden nun exportiert.
- In der EXE gibt es nun die Importe dieser Funktionen (welche viele oftmals in eine eigenständige Unit auslagern)
- Nun kann die EXE also über die Importe auf die DLL-Funktionen und somit auch auf die Komponente zugreifen.

Blamaster 18. Mai 2010 15:04

Re: Zugriff von Form auf Komponente der dll ?
 
Hi,

das war es immernoch nicht, aber Danke für deine Bemühungen :)

Zitat:

Und hier klang es eben so, als wenn
eine Form in der EXE
und 2 Forms + Komponente in der DLL
miteinander reden sollen.
2 Forms + Komponente in der DLL. Das Außenstehende Programm, welches Später mit der Exe arbeitet ist dabei nun an dieser Stelle völlig zu vernachlässigen.

Betrachten wir die dll also als eigenstäniges komplettes Programm, so das die eigentliche .exe in der Dll später nur eine Startfunction aufruft und die Dll danach alleine für sich arbeitet.

Ich muss nun doch mal ebend etwas Beispielscode geben.

Delphi-Quellcode:
library DllExample;

uses
  SysUtils,
  Classes,
  ComServ,
  ComObj,
  OoMisc,
  AdPort,
  Dialogs,
  Windows,
  Forms,
  Optional_window in 'Optional_window.pas' {Form2};

{$R *.res}

var
  ComPort: TApdComPort;
  Optionalwindow: TForm2;

// Hilfs Functions

// Dll Export Functions

function Plugin_init(): Boolean; stdcall;
begin
  ComPort := TApdComPort.Create(nil);
  Optionalwindow := TForm2.Create(Application);
end;

function Plugin_SendValue(value: string): boolean; stdcall;
begin
  // Code zum senden der Werte
end;

function Plugin_show_additionalwindow(): Boolean; stdcall;
begin
  Optionalwindow.ShowModal;
end;

exports
  Plugin_Sendvalue,
  Plugin_show_additionalwindow;

begin
  Plugin_init;
end.
Nun hat die eingebundene Form (Optional_window in 'Optional_window.pas' {Form2};) ebend 2 Buttons und will damit diese Function hier nutzen:
function Plugin_SendValue(value: string): boolean; stdcall;

Und hier ist dann auch mein Problem. Im Falle eines Delphiprogramms und unter der Annahme DllExample ist eine Unit und keine Libary würde ich jetzt im ButtonOnClick der Optional_window auf UnitXYZ.Plugin_SendValue zugreifen können, was nun ja aber nicht geht da DllExample ebend keine Unit sondern eine libary ist.

Ich hoffe mein Problem ist nun etwas deutlicher geworden.

Mfg Yannic

mkinzler 18. Mai 2010 15:40

Re: Zugriff von Form auf Komponente der dll ?
 
Du musst, wie in einem Projket einer exe einfach die Units einbinden. Ein Library-Projekt unterscheidet sich hier nicht von einem Exe-Projekt

Blamaster 18. Mai 2010 16:08

Re: Zugriff von Form auf Komponente der dll ?
 
Ja aber im Normalfall würde ich dann nun DllExample in den Uses der Form Optional Window aufnehmen. Das geht aber nicht.

Mfg Yannic

DeddyH 18. Mai 2010 16:12

Re: Zugriff von Form auf Komponente der dll ?
 
Wieso denn das? Du nimmst bei einer Exe ja auch die *.dpr nicht mit in die uses-Klausel auf.

Blamaster 18. Mai 2010 16:51

Re: Zugriff von Form auf Komponente der dll ?
 
Genau das ist ja mein Problem.

Im Falle einer .exe Arbeite ich ja auch nicht mit der .dpr selber.

Im falle der dll scheine ich es ja aber zu müssen wenn mann prgram XYZ mit libary XYZ gleichsetzen will.

Im Falle einer normalen exe habe ich nunmal gleich die Unit des Hauptforms zur Hand und arbeit dort. Das ganze habe ich bei einer dll ja nun aber nicht.

Ich habe doch oben einen Beispielcode gepostet. Kann keiner anhand des Codes erklären wie ich es schaffen kann die benötigte function aus dem OptinalForm aufzurufen ?

Mfg Yannic

DeddyH 18. Mai 2010 16:54

Re: Zugriff von Form auf Komponente der dll ?
 
Dann schreib Dir doch eine Hostanwendung, die die Funktion aus der DLL aufruft. Diese kannst Du ja in der IDE zuweisen.

Blamaster 18. Mai 2010 17:01

Re: Zugriff von Form auf Komponente der dll ?
 
Muss das ganze denn wirklich so komplziert sein ?

Es muss doch möglich sein innerhalb der eigenen Dll ohne großen Aufwand die eigenen functionen nutzen zu können.

mkinzler 18. Mai 2010 17:30

Re: Zugriff von Form auf Komponente der dll ?
 
Ist es auch! Aber du scheinst uns ja nicht zu glauben!

Blamaster 18. Mai 2010 17:44

Re: Zugriff von Form auf Komponente der dll ?
 
Ich würde es ja gerne glauben. Ich komme nur einfach nicht hinter wie ihr es genau meint. :(

Lässt sich das ganze evtl. für dll Laien etwas einfacher umschreiben ?

Müssen die Functionen aus der libary raus in eine eigene Unit die ich dann wiederum in der libary einbinde ?

Danke das ihr noch nicht die nerven verloren habt ;)

mkinzler 18. Mai 2010 17:47

Re: Zugriff von Form auf Komponente der dll ?
 
Zitat:

Müssen die Functionen aus der libary raus in eine eigene Unit die ich dann wiederum in der libary einbinde ?
So würde ich es machen.
Aber wie gesagt im Grundsatz unterscheidet sich eine DlL(ibrary) nicht von einem Programm.
Die exportierten Funktionen müssen sich auch nicht in der Projektdatei(dpr) befinden

Blamaster 18. Mai 2010 18:22

Re: Zugriff von Form auf Komponente der dll ?
 
Zitat:

Die exportierten Funktionen müssen sich auch nicht in der Projektdatei(dpr) befinden
Das war der passende Denkanstoß :oops:

Jetzt läuft es Danke :)


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