Thema: Delphi DLL Parser Plugins

Einzelnen Beitrag anzeigen

Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#11

Re: DLL Parser Plugins

  Alt 21. Dez 2009, 12:05
Zitat von Elvis:
[1]und das willst du weil platte C-kompatible DLLs bestenfalls als menschenverachtende Folter in Den Haag verhandelt werden sollten
Genau das hatte ich vor. Nun stolpere ich aber alle Nase lang über Interfaces und bekomme ein schlechtes Gewissen. (Auch wenn ich die Idee mit einem generischen Pointer und einer einfach Konstante, damit die DLL weiß, was da für ein Typ hinter dem Pointer steckt, reizvoll finde.. ).

Ich raffe irgendwie den C#-Teil noch nicht so ganz. Nehmen wir mal folgendes Beispiel:

Das Programm soll modular aufgebaut sein. Das heißt, ich soll nach belieben Plugins hinzufügen und wegnehmen können. Nehmen wir mal an, dass das Programm eine Klasse hat, die so aufgebaut ist:

Delphi-Quellcode:
  Type
    Tst_mmclass = class
      private
        (* Path of the file being played *)
        fMediaFile : AnsiString;
        (* Handle of the current audio stream *)
        fCurrentStream : HSTREAM;
        (* Handle of the application *)
        fAppHandle : HWND;
        (* Stream is playing *)
        fStreamIsPlaying: Boolean;
        (* We need the Plugin Observer, so this class can adress plugins *)
        fPluginObserver: TPluginObserver;
        (* Assign Channel to new Media File *)
        procedure NewMediaFile(const Value: AnsiString);
        procedure SetPluginObserver(const Value: TPluginObserver);
      public
        property MediaFile : AnsiString read fMediaFile write NewMediaFile;
        property AppHandle : HWND read fAppHandle write fAppHandle;
        property CurrentStream : HSTREAM read fCurrentStream write fCurrentStream;
        property StreamIsPlaying : Boolean read fStreamIsPlaying write fStreamIsPlaying;
        property PluginObserver : TPluginObserver read fPluginObserver write SetPluginObserver;
        (* Playback Control *)
        procedure Play;
        procedure Pause;
        procedure NextTrack;
        procedure PrevTrack;
        (* Initialization of Bass.dll *)
        procedure InitBass(Path: AnsiString);
        (* Deinitialization of Bass.dll *)
        procedure DeInitBass;
        (* Con- & Destructor *)
        Constructor Create;
        Destructor Destroy; override;
    end;
Ferner gibt es eine Klasse, TPluginObserver, die eine Liste aller geladenen Plugins verwaltet. Außerdem soll sie eigentlich auch die Aufrufe der Plugins und die Nachrichten der Plugins an die Anwendung verwalten. (Ja, mit meinem System hätte ich mit SendMessage Application-interne Nachrichten verschickt, mit entsprechenden Pointer garniert.) Meine Hoffnung an Interfaces ist, dass ich das gar nicht machen muss.

Angenommen, ich möchte jetzt, dass ein Plugin eine Playlist bereitstellt. Wie würde jetzt ein Beispiel mit Interfaces aussehen, in dem das Plugin dem Hauptprogramm den Dateipfad übergibt (soll in die Property "MediaFile" geschrieben werden) und anschließend die Prozedur "Play" ausführt. Und wie würde man in die andere Richtung kommunizieren? Denn wenn der Anwender auf "Next Track" klickt, muss ich dem Plugin ja mitteilen können, dass ich jetzt den nächsten Eintrag aus der Liste brauche...

Oder sollte ich zur Kommunikation meine Observer-Klasse ausbauen?

Würde mich über ein Beispiel zu diesem Anwendungsfall freuen, ich stehe gerade etwas auf dem Schlauch...
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat