![]() |
DLL Plugin Frage
Hi,
Sorry wegen dem Titel. Mir ist nach 5 Minuten immernoch kein besserer eingefallen. Falls jemand einen besseren Namen weiß, werd ichs ändern. Zu meiner Frage: Ich schreibe ein Programm und das kann sagen wir mal .abc Dateien öffnen (also gemeint ist nicht das .abc Format sonder ein x-beliebiges). Dann soll es möglich sein per DLL dem Programm die Fähigkeit zu geben auch .xyz Dateien öffnen zu können. Also meine Anwendung ist eine MDI-Anwendung. Das Pluginsystem funktioniert im Moment so: Anwendung:
Delphi-Quellcode:
DLL
procedure TForm1.FormCreate(Sender: TObject);
var dll: hModule; Register: procedure(const List: TFileFormatList); begin List := TFileFormatList.Create; dll := LoadLibrary('DLL\Formats.dll'); Register := GetProcAddress(dll,'Register'); Register(List); end; procedure TForm1.Button1Click(Sender: TObject); var AFile: IFileFormat; begin if Opendialog1.Execute then begin AFile := List.GetFormat(ExtractFileExt(Opendialog1.Filename)); AFile.LoadFromFile(Opendialog1.Filename); end; end;
Delphi-Quellcode:
Schnittstelle:
library Plugin;
uses Classes, FFTypes; {$R *.res} type T3D2File = class(TInterfacedObject, IFileformat) public procedure LoadFromFile(const Filename: PChar); end; { T3D2File } procedure T3D2File.LoadFromFile(const Filename: PChar); begin ShowMessage('3d2.LoadFromFile: ' + Filename); end; function New3D2: IFileFormat; begin Result := T3d2File.Create; end; procedure Register(const List: TFileFormatList); begin List.Add('.3d2',@New3D2); end; exports Register; begin end.
Delphi-Quellcode:
Das funktioniert soweit auch aber das eigentliche Problem ist, dasses sein kann, das .abc eine Bilddatei ist und .xyz eine Audiodatei und .asd eine Textdatei etc. Und je nachdem sieht das Fenster, in dem die Datei dargestellt wird anders aus. Also man kann ja z.B. kein Bitmap auf einem Formular darstellen, welches dafür gedacht ist Audiodateien abzuspielen usw. Jetzt ist die Frage wie man sowas lösen kann. Ich könnte es theoretisch anstellen, dass das Plugin das Formular für seine Datei komplett alleine erstellen kann/darf. Aber da hat das Plugin einfach zu viel Macht. Man kann ja auf son Formular sonstwas programmieren. Versteht ihr das Problem?
unit FFTypes;
interface uses Classes; type IFileFormat = Interface(IUnknown) ['{1CF74E69-391A-4BF4-8F0D-E5C958D21196}'] procedure LoadFromFile(const Filename: PChar); end; TCreateFile = function: IFileFormat; PFileFormat = ^TFileFormat; TFileformat = record Ext: String; Proc: TCreateFile; end; TFileFormatList = class(TList) private function GetItems(Index: Integer): PFileFormat; procedure SetItems(Index: Integer; const Value: PFileFormat); public function Add(const AExt: String; AProc: TCreateFile): Integer; function GetFormat(const AExt: String): IFileFormat; property Items[Index: Integer]: PFileFormat read GetItems write SetItems; default; end; implementation { TFileFormatList } function TFileFormatList.Add(const AExt: String; AProc: TCreateFile): Integer; var newFile: PFileFormat; begin New(NewFile); with NewFile^ do begin Ext := AExt; Proc := AProc; end; Result := inherited Add(NewFile); end; function TFileFormatList.GetFormat(const AExt: String): IFileFormat; var i: Integer; begin for i:= 0 to Count-1 do if Items[i].Ext = AExt then begin Result := Items[i].Proc(); exit; end; Result := nil; end; Jetzt ist die Frage wie ich sowas realisieren kann. Wenn ihr jetzt nichts verstanden habt dann fragt nochmal nach :freak: Gruß Neutral General |
Re: DLL Plugin Frage
Wenn ich Dich richtig verstanden habe, dann willst Du einen Viewer basteln, welcher mit allen/vielen Formaten gut kann. Um nicht für jedes Format separat installiert zu werden, möchtest Du den einfach für alle installieren.
Problem: jetzt wird es ein ganz großes Plugin. Lösung: Registriere ein "Proxy-Plugin" für alle and dann lade eine weitere DLL nach, je nach dem was für ein Dateityp Du gerade betrachten willst ;) ...:cat:... |
Re: DLL Plugin Frage
Hi,
Ich verstehe deine Lösung leider nicht. Ich bin mir auch nicht ganz sicher ob du genau mein Problem verstanden hast. Natürlich ist es auch blöd wenn ich eine riesige DLL habe (ah Moment ich glaube ich habe deine Lösung grad verstanden). Mein Problem ist das ich die Dateien ja irgendwie anzeigen muss. Und das soll in einem MDI-Child-Fenster geschehen. Natürlich kann ich nicht das gleiche Fenster für zwei völlig unterschiedliche Dateitypen benutzen. Also ist die Frage ob das Plugin selbst eine Form erstellen darf/kann/soll, also nach dem Muster:
Delphi-Quellcode:
Oder irgendwie anders. Weil so kann jedes Plugin ja mehr oder weniger tun und lassen was es will. Es kann ja theoretisch ganze Programme als MDI-Child in mein Programm einbinden, was ja nicht erwünscht ist. :?
interface
type T3D2AnzeigeFenster = class(TForm) private public end; implementation // PseudoCode procedure T3D2File.LoadFromFile(const Filename: PChar); var win: T3D2AnzeigeFenster; // = class(TForm) begin win := T3D2AnzeigeFenster.Create(App.Application); win.FormStyle := fsMDIChild; // [...] Load win.Show; end; Gruß Neutral General |
Re: DLL Plugin Frage
Generell sollte es gehen. Allerdings sind ein paar Dinge bei Formularen in DLLs zu beachten. Dazu auch [dp]DLL Form*[/dp] und
![]() ...:cat:... |
Re: DLL Plugin Frage
Hi,
hast du das gelesen: Zitat:
Ich würde das wahrscheinlich schon schaffen eine Form aus einer DLL anzuzeigen aber die DLL hat mir einfach zu viel Macht. Ich meine wer schreibt dem Plugin vor beim Aufruf von LoadFromFile ein Formular zu öffnen in dem die Datei angezeigt wird? Man kann ja theoretisch auf diesem Plugin-Formular ganze Programme unterbringen. Dann läd man nachher ne mp3 und hat dann en Fenster mit nem voll funktionsfähigem Mediaplayer :wall: ... im "Idealfall". Im schlimmsten Fall hat man ein Formular mit sonstirgendwas aufm Bildschirm. Also am besten wärs ja so in der Art wenn die DLL nur die Datei laden würde und das Hauptprogramm für die Darstellung zuständig wäre. Aber das Problem ist ja, das das Hauptprogramm ja nicht unbedingt wissen kann wie es jetzt irgendwelche Daten anzeigen soll. Also ums klar auszudrücken: Am liebsten wäre es mir wenn das Plugin läd und das Hauptprogramm anzeigt. |
Re: DLL Plugin Frage
Hallo,
Zitat:
Und wenn Du neue Viewer brauchst, kannst Du immer noch dafür eine Schnittstelle basteln und Viewer-Plugins schreiben. Übrigens: eine DLL, die in Deinen Adressraum geladen wird, kann sowieso machen, was sie will. Das mit der Macht ist eben so eine Sache... Gruß xaromz |
Re: DLL Plugin Frage
Zitat:
Wenn dein Hauptprogramm Audio wiedergeben können soll, muss es einen Player bieten und über eine definierte Schnittstelle (z.b. Wavdaten) von jedem Audio-Plugin die Daten im gleichen Format zur verfügung gestellt bekommen. Wenn Bilder dargestellt werden können sollen, musst du eben einen Bildbetrachter basteln, der von den Plugins dann z.b. immer mit Bitmap-Daten gefüttert werden muss. Usw und so fort. D.h. für jede mögliche "Dateiart" muss ein Viewer gebaut werden (könnten ja auch Plugins sein, mit nicht offener Schnittstelle), und deine anderen Plugins konvertieren dann immer nur "ihre" Daten in ein vordefiniertes Format, welches dein Viewer wiedergeben kann. Ich glaube, so würde ich da rangehen. Greetz Wormid |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:58 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