Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ein Tabsheet aus einer DLL erzeugen in ein Pageconrol (https://www.delphipraxis.net/140714-ein-tabsheet-aus-einer-dll-erzeugen-ein-pageconrol.html)

Digielm 24. Sep 2009 11:51


ein Tabsheet aus einer DLL erzeugen in ein Pageconrol
 
Hallo an alle,

ich stehe grade auf dem Schlauch.

Ich möchte gerne aus einer Programmunit einen Aufrufstarten, der aus einer DLL ein zusätzlich gebautes TTabsheet erzeigt und anzeigt.
Dieses soll dann in das Pagecontrol aus dem Hauptprogramm hinzugefügt werden.

Ich möchte eigentlich keine Funktion in die DLL packen, also nur das Tabsheet.

Wie bekomme ich das denn hin ?

Das Laden der Lib ist ja noch kein Problem, aber dann hab ich ja die Funktion
GetProcAddress
und vorher muß ich ja noch einen Type definieren, der auf die Funktion in die dll zeigt.

Hat jemand eine Idee wie ich das hinbekomme ??

Danke an alle

Bernhard Geyer 24. Sep 2009 12:26

Re: ein Tabsheet aus einer DLL erzeugen in ein Pageconrol
 
Bedenke das das nur funktioniert wenn DLL und Exe mit der gleichen Compilerversion und aktivierten Laufzeitthemes kompiliert werden.

Digielm 24. Sep 2009 12:28

Re: ein Tabsheet aus einer DLL erzeugen in ein Pageconrol
 
ja das ist mit schon klar.
Setze beidesmal Delphi 2009 ein.

Bleibt nur die Frage wie ich das Sourcetechnisch umsetzen kann.

fajac 24. Sep 2009 13:47

Re: ein Tabsheet aus einer DLL erzeugen in ein Pageconrol
 
Wenn deine Funktion z.B. "GetNewTab" heißen soll:

In der Dll:

Delphi-Quellcode:
 
exports
  GetNewTab;

function GetNewTab : TTabSheet;
{...}
In der App:

Delphi-Quellcode:
type
  TGetTab = function : TTabSheet;


var
  hLib  : Cardinal;
  getTab : TGetTab;

procedure GetNewTabFromDll;
var
  sheet : TTabSheet;
begin
  hLib := LoadLibrary (LibPath);
  if hLib > 0 then
  begin
    getTab := TGetTab (GetProcAddress (hLib, 'GetNewTab'));
    if Assigned (getTab) then
    begin
      sheet := getTab();
      sheet.PageControl := PageControl1;
    end;
  end;
end;

Digielm 25. Sep 2009 11:22

Re: ein Tabsheet aus einer DLL erzeugen in ein Pageconrol
 
hallo


ich habe folgende Idee:

ich benutze die Möglichkeit die gesamt Classe die ich gemacht habe also als TTabsheet zu exportieren: ( innerhalb der DLL)


Delphi-Quellcode:

RegisterClass(TMYTabsheet);
Problem dabei wäre noch das ich einen TMYTabsheet.Create(parameter) habe.

wie kann ich das einbinden.

Im MainProgramm nutze ich diesen Source:
Delphi-Quellcode:

interface
type
    TMyTabsheet = TTabSheet;
type

    mytabsheet : TMyTabsheet;

end;

procedure ladedll;
begin
  dllfile := ExtractFilePath(application.exename)+'Tabsheet.dll';

  hLib := LoadLibrary(pwidechar(dllfile));
  if hLib > 0 then
  begin
    mytabsheet := TMYTABSHEET(GetProcAddress(hLib, PChar('TMYTABSHEET'));
  end;
end;
Nur leider ist das mytabsheet bei desem Aufruf immer Nil

Was mache ich denn gedanklich falsch.

fajac 25. Sep 2009 12:25

Re: ein Tabsheet aus einer DLL erzeugen in ein Pageconrol
 
Das geht so nicht mit einer Dll. Die exportiert keine Objekte, sondern nur Funktionsadressen. Der Aufruf von GetProcAddress liefert einen Pointer auf eine solche Funktionsadresse. Da nützt auch ein Typecast wenig :lol:
Du kannst natürlich mit Hilfe einer Funktion ein Objekt aus der Dll per Funktionsaufruf erhalten - siehe mein Beispiel.
Wenn du Objekte direkt exportieren willst, musst du statt einer Dll ein Package erstellen. Auch Packages lassen sich, ähnlich wie Dlls, dynamisch laden. Du benötigst dazu die Funktion "LoadPackage". Ich bin sicher, in der DP gibt es dazu eine Menge zu erfahren.

Digielm 25. Sep 2009 12:30

Re: ein Tabsheet aus einer DLL erzeugen in ein Pageconrol
 
Hallo

hab da was im DP Forum gefunden zu

Delphi-Quellcode:
   
    pc := GetClass('TmyTABSHEET');
    if PC <> Nil then
    begin
      MYTABSHEET := TTABSHEET(pc).Create('TESTCAPTION');
    end;
da kriege ich aber leider auch fehler.

Ich habe das Problem das ich eingentlich die Unit mit der Classe TMYTABSHEET nicht in ein Projekt einbinden will, sondern kompl. dynamisch darauf zugreifen möchte, auch mit div. zusätzlichen aufrufen , die es in TTabsheet nicht gibt.

Das muß doch irgenwie machbar sein.

himitsu 25. Sep 2009 12:33

Re: ein Tabsheet aus einer DLL erzeugen in ein Pageconrol
 
Zitat:

Zitat von fajac
Das geht so nicht mit einer Dll. Die exportiert keine Objekte, sondern nur Funktionsadressen. Der Aufruf von GetProcAddress liefert einen Pointer auf eine solche Funktionsadresse. Da nützt auch ein Typecast wenig :lol:

Direkt nicht ... du kannst dich ja gern mal im "DLL"-Verzeichnis in meinem himXML umsehen.
Da erkennt man leicht, was ich für einen Aufwand betreiben mußte, um Klassen aus einer DLL in die EXE zu exportieren.
Im Endefekt sieht es so aus, daß ich die RTTI von Dummy-Klassen in der EXE, beim Laden der DLL, durch deren RTTI-Informationen ersetze und zusätzlich muß natürlich auch noch ein Shared-Memory-Manager eingerichtet sein, damit die Speicherverwaltung nicht durchdreht (z.B. Speicher bei einem Manager reservieren und versuchen bei einem anderen Manager zu ändern, bzw. freizugeben).


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