Frage

Plug-in-Systeme in C++ sind schwierig, weil die ABI nicht richtig definiert ist und jeder Compiler (oder jede Version davon) seinen eigenen Regeln folgt.COM unter Windows zeigt jedoch, dass es möglich ist, ein minimales Plug-in-System zu erstellen, das es Programmierern mit unterschiedlichen Compilern ermöglicht, Plug-ins für eine Hostanwendung über eine einfache Schnittstelle zu erstellen.

Seien wir praktisch und lassen wir den C++-Standard, der in dieser Hinsicht nicht sehr hilfreich ist, für eine Minute beiseite.Wenn ich eine App für Windows und Mac (und optional Linux) schreiben möchte, die C++-Plug-Ins unterstützt, und wenn ich Plug-In-Autoren eine einigermaßen große Auswahl an Compilern bieten möchte (z. B. weniger als 2 Jahre alte Versionen von Visual C++). , GCC oder Intels C++-Compiler), auf welche Funktionen von C++ kann ich zählen?

Natürlich gehe ich davon aus, dass Plug-Ins für eine bestimmte Plattform geschrieben werden.

Aus dem Kopf fallen mir hier einige C++-Funktionen ein, die meiner Meinung nach die Antwort darauf sind:

  • vtable-Layout, um Objekte über abstrakte Klassen zu verwenden?(Ja)
  • Integrierte Typen, Zeiger?(Ja)
  • Strukturen, Gewerkschaften?(Ja)
  • Ausnahmen?(NEIN)
  • externe „C“-Funktionen?(Ja)
  • stdcall nicht externe „C“-Funktionen mit integrierten Parametertypen?(Ja)
  • Nicht-Standardaufruf, nicht-externe „C“-Funktionen mit benutzerdefinierten Parametertypen?(NEIN)

Ich würde mich über Ihre Erfahrungen in diesem Bereich freuen, die Sie mit uns teilen könnten.Wenn Sie eine mäßig erfolgreiche App kennen, die über ein C++-Plug-in-System verfügt, ist das auch cool.

Carl

War es hilfreich?

Lösung

Dr. Dobb's Journal hat einen Artikel Erstellen Sie Ihr eigenes Plugin-Framework:Teil 1 Das ist eine ziemlich gute Lektüre zu diesem Thema.Es ist der Beginn einer Artikelreihe, die sich mit der Architektur, Entwicklung und Bereitstellung eines plattformübergreifenden C/C++-Plugin-Frameworks befasst.

Andere Tipps

Möglicherweise möchten Sie auch darüber nachdenken, die herkömmliche Plugin-Schnittstelle durch eine Skriptschnittstelle zu ersetzen.Es gibt einige sehr gute Bindungen für mehrere Skriptsprachen in C/C++, die Ihr Problem bereits gelöst haben.Es wäre vielleicht keine schlechte Idee, darauf aufzubauen.Schauen Sie sich zum Beispiel an Boost.Python.

Qt hat ein sehr schönes System für Plugins, die ich in der Vergangenheit verwendet habe.Es nutzt das Metaobjektsystem von Qt, um viele der Probleme zu überwinden, die typischerweise bei der Entwicklung von C++-Plugins auftreten.

Ein Beispiel ist, wie Q_DECLARE_INTERFACE funktioniert, um zu verhindern, dass Sie ein inkompatibles Plugin verwenden.Ein anderer ist der Build-Schlüssel, um sicherzustellen, dass Sie das richtige Plugin für Ihre Architektur, Ihr Betriebssystem und Ihren Compiler laden.Wenn Sie das Plugin-System von Qt nicht verwenden, müssen Sie sich um diese Dinge kümmern und selbst Lösungen erfinden.Es ist nicht unbedingt eine Raketenwissenschaft, und ich sage nicht, dass man daran scheitern würde, aber die Jungs von Trolltech sind ziemlich schlau und haben eine Weile darüber nachgedacht, und ich würde lieber das verwenden, was sie geschaffen haben, als das Rad selbst neu zu erfinden .

Ein weiteres Beispiel ist das RTTI funktioniert normalerweise nicht über DLL-Grenzen hinweg, aber bei Verwendung von Qt können Dinge wie qobject_cast die auf dem Metaobjektsystem basieren, funktionieren über DLL-Grenzen hinweg.

Ich denke, dass Sie auf der sicheren Seite sind, wenn Sie ein Plugin-System erstellen, das auf Folgendem basiert:

  • Packen der Plugin-Funktionalität in eine Bibliothek (.dll, .so usw.)
  • Erfordert, dass das Plugin wichtige Exporte in der C-Sprache bereitstellt.
  • Erfordert, dass das Plugin eine abstrakte C++-Schnittstelle implementiert (und einen Zeiger/Referenz darauf zurückgibt).

Das wohl erfolgreichste C++-Plugin-System:gute alte Adobe Photoshop.Und wenn nicht, eines der virtuellen Synth-Formate wie VSTi usw.

Das Buch Unvollkommenes C++ von Matthew Wilson hat eine nette Info dazu.

Der Rat im scheint zu sein:Solange Sie denselben (oder einen gleichwertigen) Compiler verwenden, können Sie C++ verwenden. Andernfalls ist es besser, C als Schnittstelle zusätzlich zu Ihrem C++-Code zu verwenden.

AS verfügt über eine plattformübergreifende Plug-in-Architektur.

Kasse:

  1. ACE-DLL
  2. ACE DLL-Manager

Ich würde vorschlagen, sich das Buch anzuschauen
Das ACE-Programmierhandbuch

Firefox läuft auf XPCOM (http://www.mozilla.org/projects/xpcom/).Es ist von Microsoft COM inspiriert, aber plattformübergreifend.

Ich habe meine eigene Spiel-Engine mit einem C++-Plug-in-System.

Ich habe Code in den Header-Dateien, damit er in die Kompilierungseinheit des Plugins eingefügt wird.

Größere Funktionen, die in der Haupt-Engine leben, werden über eine exportierte C-Funktion aufgerufen (Plugin ruft MyObject_somefunction(MyObject *obj) auf, das in der Engine nur obj->somefunction() aufruft).Wenn der Aufruf einer C-Funktion für Ihren Geschmack hässlich ist, können Sie mithilfe einiger Header-Tricks die Member-Funktion #definieren, wenn der Header im Plugin enthalten ist, um die C-Funktion aufzurufen:

#if defined(IN_THE_PLUGIN)
void MyObject::somefunction() { MyObject_somefunction(this); }
#endif

Virtuelle Funktionen müssen entweder rein sein oder der Code befindet sich in der Header-Datei.Wenn ich nicht von einer Klasse erbe, sondern lediglich eine Instanz erstelle, kann virtueller Funktionscode in der Engine leben, aber dann muss die Klasse einige C-Funktionen exportieren, um das vom Plugin aufgerufene Objekt zu erstellen und zu zerstören.

Im Grunde handelt es sich bei den Tricks, die ich verwendet habe, um die völlige Plattformunabhängigkeit aufrechtzuerhalten, lediglich um C-Exporte und Headerdatei-Tricks.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top