Hi,
Ich habe mal Folgendes gemacht (alles so wie dein Vorschlag, also Verzeichnis durchsuchen,
DLL laden usw.):
Jede
DLL exportiert neben den Prozeduren "GetName" und "Initialize" (dazu später) beliebige Prozeduren.
Das Einzige, was diese beliebigen Prozeduren gemein haben, ist die Schnittstelle, denn sie sehen alle so aus:
Procedure SomeDLLProcedure (inParam : OleParam, var result, outParam : OleParam);
Ein- und Ausgabeparameter können also Arrays, Streams oder was auch immer sein. Result ist entweder unassigned oder enthält einen Fehler (gestreamed).
Aufgerufen wurden die über einen Plugin-Manager. Nehmen wir an, wir haben eine
DLL "MyDLL" und die hat die Prozeduren "Proc1" und "Proc2". Dann rufe ich eine Prozedur der
DLL so auf:
ThePluginManager.Call ('MyDLL.Proc1', inParam, result, outParam);
Ich habe damit also eine allgemeine Schnittstelle, die ich beliebig erweitern kann.
Der Plugin-Manager ist auch für die Kommunikation zwischen den
DLL verantwortlich, denn er übergibt der
DLL per exportierter 'Initialize' Prozedur eine Callback-Schnittstelle, sodaß auch ein Plugin über die gleiche -eben beschriebene Schnittstelle- ein anderes Plugin aufrufen kann. Oder definierte Routinen der Hauptanwendung..
Bei mir gab es in dem Sinne keine Hauptanwendung, denn die
DLL implementierten einen Webservice, wobei die einzelnen 'Anwendungen' eben diese DLLs waren.
Desweiteren habe ich dafür gesorgt, das die
DLL zur Laufzeit ausgetauscht werden können, ohne die Anwendung (den Service) beenden zu müssen. Die neue oder auszutauschende
DLL kann man per
TCP direkt in den Service impfen. Der packt die
DLL in das Plugin-Verzeichnis, entfernt die alte Version und ab einem definierten Zeitpunkt werden alle Aufrufe an die neue
DLL geleitet.
War ziemlich cool und hat auch gar nicht mal so viel Code.
Das Bild hängt schief.