![]() |
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 |
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.
|
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. |
Re: ein Tabsheet aus einer DLL erzeugen in ein Pageconrol
Wenn deine Funktion z.B. "GetNewTab" heißen soll:
In der Dll:
Delphi-Quellcode:
In der App:exports GetNewTab; function GetNewTab : TTabSheet; {...}
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; |
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:
Problem dabei wäre noch das ich einen TMYTabsheet.Create(parameter) habe.RegisterClass(TMYTabsheet); wie kann ich das einbinden. Im MainProgramm nutze ich diesen Source:
Delphi-Quellcode:
Nur leider ist das mytabsheet bei desem Aufruf immer Nil 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; Was mache ich denn gedanklich falsch. |
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. |
Re: ein Tabsheet aus einer DLL erzeugen in ein Pageconrol
Hallo
hab da was im DP Forum gefunden zu
Delphi-Quellcode:
da kriege ich aber leider auch fehler.pc := GetClass('TmyTABSHEET'); if PC <> Nil then begin MYTABSHEET := TTABSHEET(pc).Create('TESTCAPTION'); end; 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. |
Re: ein Tabsheet aus einer DLL erzeugen in ein Pageconrol
Zitat:
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 02:46 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