AGB  ·  Datenschutz  ·  Impressum  







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

DLL Parser Plugins

Ein Thema von Alaitoc · begonnen am 15. Dez 2009 · letzter Beitrag vom 29. Dez 2009
 
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#16

Re: DLL Parser Plugins

  Alt 21. Dez 2009, 22:21
Das ist gar nicht so schlimm.
Du musst allerdings ein bissel umdenken.
Du kannst du nicht diese blödsinnigen Methodpointer-Properties nehmen, die Delphi "Events" nennt,
Denn die haben ja immer nur einen Subscriber, wobei die Worte "Subscriber" oder "Event" bei der saubilligen Implementierung wie sie die VCL nutzt wohl maßlos übertrieben sind.
Da es keine interoperablen Multicast-Methodpointer gibt, musst du dir halt ein Interface bauen, was du wie einen Delegate nutzt.
Delphi-Quellcode:
type
  IEventHandler = interface
  ['']
     procedure Invoke; safecall;
  end;
Du kannst dir dann einen EventManager, Eventsink, Listener , Observer oder wie auch immer du es nennen magst, bauen, der solche IEventHandler in einer InterfaceList verwaltet und nach außen nur Add und Remove zur Verfügung stellt.
Das heißt, Plugins können nur einen Handler hinzufügen, oder exakt ihren wieder entfernen. (Sich also nicht in die Quere kommen)
Es gibt dann ein weiteres Interface, was von dem IEventManager ableitet, und ihm die Methoden Clear und Raise gibt.
Den einen um alle Handler loszuwerden, den anderen um alle zu feuern.
Dieses 2. Interface ist nur innerhalb der App zu benutzen.

Deine App könnte den Teil, der das Playback abbildet als einen Service zur Verfügung stellen:
Delphi-Quellcode:
IPlaybackEventHandler = interface
  procedure Invoke(aState : TPlaybackState); safecall; //halt irgendein enum
end;

IPlaybackEvent = interface
  procedure AddHandler(const aHandler : IPlaybackEventHandler); safecall;
  procedure RemoveHandler(const aHandler : IPlaybackEventHandler); safecall;
end;

IPlaybackProvider = interface
  procedure Play; safecall;
  procedure Stop; safecall;
  procedure Next; safecall;
  ...
  property StateChanges : IPlaybackEvent read ...; // der Manager
  property StateChanged : IPlaybackEvent read ...; // der Manager
end;
Ein Plugin könnte den Host (aus seiner Sicht: die App) nach dem Playback-Service erfragen und dort einen Handler reinwerfen, der es über Änderungen informiert.

Willst du deine App wirklich ernsthaft erweiterbar machen, dann solltest du auch innerhalb der App alles so lösen.
Dann merkst du wenn deine API, der Teil, den auch die Plugins nutzen können, nicht mächtig genug ist.

Es ist Blödsinn Dinge innerhalb der App anders zur Verfügung zu stellen, als für Plugins. (Warum darf die App direkt ins Menü pfuschen?)
Und direkten zugriff auf Dinge wie Controls oder Menus kannsu schonmal komplett vergessen, da du sonst keine Benachrichtigungen abfangen und in einem Plugin auswerten könntest, richtig?
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
 


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 19:29 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