Hallo.
Als kleine Aktualisierung (ich habe trotz Sommerferien leider nicht allzuviel Zeit) eine kleine Übersicht über die neusten Entwicklungen:
Ich habe nun ein dynamisches Pluginsystem implementiert, welches ich in dieser Weise auch in Andorra einbinden werden. Dieses Pluginsystem erlaubt es, Module sowohl statisch (durch einfaches aufnehmen in die Uses-Klausel) als auch dynamish (aus einer
DLL) zu linken - der Anwendung ist das egal.
Es existiert ein so genannter Registrationsserver (AcRegSrv, das Ac steht für "Andorra Commons"), der alle Module verwaltet:
Code:
AcRegSrv DbgDump
----------------
Name | IdentStr | SrcID | @Create
| | |
TAcStoreNode | TAcPersistent.TAcStoreNode | 0 | 4217572
TAcIntegerNode | TAcPersistent.TAcStoreNode.TAcIntegerNode | 0 | 4217608
TAcFloatNode | TAcPersistent.TAcStoreNode.TAcFloatNode | 0 | 4217644
TAcStringNode | TAcPersistent.TAcStoreNode.TAcStringNode | 0 | 4217680
TAcBoolNode | TAcPersistent.TAcStoreNode.TAcBoolNode | 0 | 4217716
TAcStreamNode | TAcPersistent.TAcStoreNode.TAcStreamNode | 0 | 4217752
TAuOpenALDriver | TAcPersistent.TAuDriver.TAuOpenALDriver | 1 | 14695264
TAuWaveOutDriver | TAcPersistent.TAuDriver.TAuWaveOutDriver | 1 | 14696360
TAuWAVDecoder | TAcPersistent.TAuDecoder.TAuWAVDecoder | 1 | 14699972
TAuAcinerellaDecoder | TAcPersistent.TAuDecoder.TAuAcinerellaDecoder | 1 | 14700932
Classes registered: 10
Current source id: 1
Von einem Modul werden Klassenname, Klassenhierarchie, Quellenidentifikationsnummer (also aus welchem Programmmodul (0 = lokal, >0 = aus einem anderen Plugin) das Plugin ist) und ein Pointer zum Konstruktor der Klasse gespeichert.
Eine
DLL mit Zusatzmodulen ist sehr einfach zu erstellen. Die im oben gezeigten Beispiel gezeigte
DLL sieht folgendermaßen aus:
Delphi-Quellcode:
library AudorraFoo;
uses
AcPersistent,
AuOpenAL, AuWaveOut32Driver, AuWav, AuAcinerella;
exports
AcDLLInit,
AcDLLFinalize,
AcDLLExportClasses;
begin
end.
Möchte man die in der Uses-Klausel aufgeführten Module statisch verwenden, so sind sie einfach im Hauptprogramm einzubinden.
Ein Plugin kann ganz einfach geladen werden:
Delphi-Quellcode:
var
plg: TAcPluginDLL;
begin
plg := TAcPluginDLL.Create;
plg.LoadPlugin('AudorraFoo.dll');
plg.RegisterClasses(TAcPersistent);
[...]
plg.Free;
end;
Ich freue mich über eure Kommentare,
Andreas