Die grundsätzliche Idee dabei ist folgende:
- Eine abstrakte Klasse TPlugin
(alle Methoden sind abstrakt)
- Ein TPluginGateway
, dass von TPlugin
abgleitet ist und die Methodenaufrufe an das echte Plugin weitergibt, wenn es denn existiert
- Ein TPluginController
(Thread) der für das TPluginGateway
das Laden/Entladen des Plugins steuert
- Ein TPluginLoader
(Thread) der vom TPluginController
gestartet wird und entweder eine Plugin-Instanz erzeugt/lädt oder eine Plugin-Instanz zerstört/entlädt
Einzig der
TPluginController
benötigt ein Event und wartet einfach, bis was passiert ...
Delphi-Quellcode:
procedure TPluginController.Execute;
begin
inherited;
while not Terminated do
begin
// Warten bis etwas passiert
FEvent.WaitFor;
case State of
csEmpty : // wenn leer, dann laden
DoLoading;
csLoading : // einfach mal nix
;
csUnloading : // einfach mal nix
;
csReady : // wenn bereit, dann entladen
DoUnloading;
end;
end;
end;
Im Anhang ein komplettes Projekt mit Source und Exe.
Ich verwende allerdings die Klassen der
RTL und nicht native
API Aufrufe (das sind im Grunde genommen nur Wrapper für die
API Aufrufe).
EDIT Anpassungen für D2010
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ea 0a 4c 14 0d b6 3a a4 c1 c5 b9
dc 90 9d f0 e9 de 13 da 60)