Die Plugin-Systeme, die ich von allen wissen, verwenden dynamische Bibliotheken. Grundsätzlich müssen Sie einen kleinen, effektiven Handshake zwischen dem Systemkern und den Plugins definieren. Da es keine C++ - ABI gibt, müssen Plugins entweder nur eine C-API verwenden oder den gleichen Compiler (und wahrscheinlich die Compiler-Version) als Systemkern verwenden.
Das einfachste denkbare Protokoll wäre eine Funktion, die alle Plugin-Entwickler bereitstellen müssten, die eine Instanz einer von der Basisklasse abgeleiteten Klasse als Basisklassenzeiger zurückgibt. (Die extern "C"
stellt sicher, dass Funktion keinen verstümmelten Namen hat, und ist somit leichter durch seine Namen zu finden.) So etwas wie:
extern "C" {
plugin_base* get_plugin();
}
Der Kernel würde dann versuchen, Binärdateien in dafür vorgesehenen Stellen als dynamisches gefunden zu laden Bibliotheken und versuchen, die get_plugin()
Funktion zu finden. Wenn es erfolgreich ist, ruft es diese Funktion auf und endet mit einer geladenen Plugin-Instanz.
Natürlich wäre es schön, auch Funktionen haben, um die Version der API das Plugin gegen gegen die Version des Kernel kompiliert überprüfen wurde. (Sie könnten diese Basisklasse schließlich ändern.) Und Sie könnten andere Funktionen haben, die Informationen über das Plugin zurückgeben (oder Sie haben dies als virtuals in der Basisklasse). Das hängt sehr von der Art Ihres Systems ab.
Wenn plugin_base nicht POD ist, aber es eine Klasse ist, die von der Basis-Plugin-Klasse erbt, denke ich, dass für die ganze Sache eine Art von C++ ABI (die von dem verwendeten Compiler definiert) verwendet werden müsste.: S –
@Matteo: Ja, du hast dort einen sehr gültigen Punkt. Vielen Dank. Ich habe meine Antwort entsprechend angepasst. – sbi
Kein Problem. :) BTW, eine Alternative zu Windows wäre die Verwendung von COM, die tatsächlich teilweise als C++ ABI-kompatibel mit anderen Sprachen gesehen werden kann. –