"unbekannten" Code integrieren
-
Ich möchte Code, der zur Compilezeit unbekannt ist in mein Programm integrieren können. Wie kann ich das machen? Damit vielleicht klarer wird was ich eigentlich meine: In Java kann man Klassen die zur Compilezeit unbekannt waren im Programm verwenden , in dem man mit
Object x= Class.forName("MyClass");
die Klasse anhand ihres Namens "nachträglich" lädt.. geht something alike auch mit C/C++ ?
-
mit ner DLL
-
ahja..gibts da irgendwo Beispiele/Tutorials wie ich ne dll für die Sache verwenden kann?
-
Ne DLL ist aber Windo$.
-
frager: welches os? oder soll das plattformunabhängig sein? dann bleib bei java.
-
für windoof.. platformunabhängig braucht nich sein.. dll is also ok
-
Hilfe für solche DLL´s findest du in der Hilfe des MS VC Compiler´s oder in der MSDN, die ja auch im Netz zugänglich ist.
Im Endeffekt packt man alle Funktionen die man auslagern möchte in eine Library, macht daraus eine dll (analog wie man früher eine statische Library gemacht hat).
Auf solche eine Library kann dann mit Loadlibrary zugegriffen werden, auf die einzelnen
Funktionen kann man dann mit GetProcAddress zugreifen.Näheres in den obengenannten Quellen
-
Ich glaube nicht, daß das geht. Für mich sieht dieses Java-Beispiel so aus, daß ein Objekt dieser unbekannten Klasse angelegt wird. Hierfür braucht man in C++ aber eine vollständige Definition der Klasse. Wie sonst sollte new() den richtigen Speicher reservieren, den Konstruktor aufrufen ggf. die vft initialisieren (...)?
Aus einer DLL kann man meines Wissens nur Funktionen "nachladen", keine Methoden und erstrecht keine Klassen. Aber ich lasse mich gern eines besseren belehren.Stefan.
-
Richtig, du kannst aus einer DLL nur Funktionen laden.
Was die Funktionen aber intern machen steht auf einem anderen Blatt äh in der DLL.Also muß nur der public-Teil der DLL zur Kompilierung des Programmes bekannt sein. Der Rest wird erst zur Laufzeit interessant.
Wenn man die DLL noch Dynamisch läd, kann man sogar zur Laufzeit noch die Funktionen intern verändern.
-
http://www.flipcode.com/tutorials/tut_dll01.shtml
Dynamisches Laden ist genau das richtige für Plugins
Das IFace muß halt zur Compilezeit bekannt sein.Du kannst ja z.B. in der DLL deine Class so initialisieren und vernichten:
// Interface erstellen PACKER_API bool GetPackerInterface(IPacker **_cPacker) { if(*_cPacker != NULL) return false; *_cPacker = new CPacker; if(*_cPacker == NULL) return false; return true; } // GetInterface // Interface freigeben PACKER_API bool FreePackerInterface(IPacker **_cPacker) { if(*_cPacker == NULL) return false; delete *_cPacker; *_cPacker = NULL; return true; } // FreeInterface