AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DLL Plugin Frage

Ein Thema von Neutral General · begonnen am 15. Feb 2008 · letzter Beitrag vom 15. Feb 2008
Antwort Antwort
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

DLL Plugin Frage

  Alt 15. Feb 2008, 11:32
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:
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;
DLL

Delphi-Quellcode:
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.
Schnittstelle:
Delphi-Quellcode:
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;
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?

Jetzt ist die Frage wie ich sowas realisieren kann.
Wenn ihr jetzt nichts verstanden habt dann fragt nochmal nach

Gruß
Neutral General
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: DLL Plugin Frage

  Alt 15. Feb 2008, 12:18
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

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

Re: DLL Plugin Frage

  Alt 15. Feb 2008, 12:29
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:
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;
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.

Gruß
Neutral General
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: DLL Plugin Frage

  Alt 15. Feb 2008, 13:03
Generell sollte es gehen. Allerdings sind ein paar Dinge bei Formularen in DLLs zu beachten. Dazu auch [dp]DLL Form*[/dp] und Bei Google suchenDelphi DLL Form.

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

Re: DLL Plugin Frage

  Alt 15. Feb 2008, 13:43
Hi,

hast du das gelesen:

Zitat:
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.


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 ... 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.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#6

Re: DLL Plugin Frage

  Alt 15. Feb 2008, 14:31
Hallo,
Zitat von Neutral General:
Also ums klar auszudrücken: Am liebsten wäre es mir wenn das Plugin läd und das Hauptprogramm anzeigt.
warum baust Du dann nicht ins Hauptprogramm einige Standardviewer ein (Bilder, Videos, Musik...) und lässt Dir vom Plugin sagen, welcher gerade gebraucht wird?
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
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
Benutzerbild von Wormid
Wormid

Registriert seit: 26. Aug 2003
Ort: Steinfurt
292 Beiträge
 
Delphi XE2 Professional
 
#7

Re: DLL Plugin Frage

  Alt 15. Feb 2008, 14:31
Zitat von Neutral General:
Also ums klar auszudrücken: Am liebsten wäre es mir wenn das Plugin läd und das Hauptprogramm anzeigt.
Dann mach es doch auch so... aber so ist eben kein Viewer möglich, der automatisch wirklich alles kann...

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
Debuggers don't remove Bugs, they only show them in Slow-Motion.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:36 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