Plugin Archikektur ohne COM+
-
Ich würde gerne wissen, ob es möglich ist, eine Pluginarchitektur zu schreiben, die von allen möglichen C++ compilern unter Windows unterstüzt wird, ohne COM+ benutzen zu müssen. Ich sehe ein Problem im unterschiedlichen name-mangling der verschiedenen Compiler. Wie kann ich ein Objekt aus einer DLL importieren, die mit verschiedenen Compilern gebaut wurden und es in meinem Host-Programm nutzen?
-
Mit extern "C". Du darfst dann halt nur keine Klassen nach aussen geben, wenn es auch unter C verwendet werden soll.
extern "C" stellt u.a. das Name-Mangling ab. Such mal danach im forum, da gibts X-Threads.Beispiel:
struct Plugin { void* handle; }; extern "C" Plugin* LoadPlugin(int version) { }Wenn du das so exportierst, dann ist das für alle Compiler lesbar.
rya.
-
Wenn Du eine DEF-Datei beim erzeugen der DLL verwendest, hast Du keine Probleme. Dann sind die Namen genau so, wie sie sein müssen.
-
Plugin schrieb:
Ich würde gerne wissen, ob es möglich ist, eine Pluginarchitektur zu schreiben, die von allen möglichen C++ compilern unter Windows unterstüzt wird, ohne COM+ benutzen zu müssen.
Genau dafür gibt es COM. Warum willst du es nicht benutzen?
(Du kannst natürlich auch nur auf die Prinzipien von COM (Safecall-Aufrufkonvention, Interfaces, IIDs, IUnknown) aufbauen, ohne die konkrete Implementation von Windows einsetzen zu müssen. Aber ohne das wird es nicht gehen.)Plugin schrieb:
Ich sehe ein Problem im unterschiedlichen name-mangling der verschiedenen Compiler. Wie kann ich ein Objekt aus einer DLL importieren, die mit verschiedenen Compilern gebaut wurden und es in meinem Host-Programm nutzen?
Gar nicht; die Namensdekorierung ist noch das geringste Problem. Dazu kommt, daß unterschiedliche Compiler, ja sogar unterschiedliche Versionen eines Compilers verschiedene Aufrufkonventionen, andere Standardbibliotheken verwenden, unterschiedliche Exception-Codes und -Informationen benutzen, das binäre Layout unterschiedlich handhaben und insbesondere RTTI und Polymorphismus vollkommen individuell implementieren.
Edit: E2293 ')' erwartet
-
Scheint so, als ob ich nicht um dieses COM dingens herumkomme. Kann mir wer ein Tutorial dazu empfehlen?
-
Kann man auch CORBA als ersatz für COM nehmen?