C++ DLL in C Programm verlinken??
-
Mal ne blöde Frage... (oder auch nich!?:)
kann ich bspw. ein C++ Programm in eine DLL packen, und dies dann in einem C Programm verwenden??
Grüße
-
Hallo
Du packst natürlich kein Programm in eine DLL, sondern Funktionen/Klassen.
Wenn du für die DLL ein C-Interface einbaust kannst du auch diese DLL von C aus benutzen. Innerhalb der DLL kannst du dann wieder mit Klassen etc arbeiten.bis bald
akari
-
ja das problem ist , das ich meinentwegen 50 Klassen in einem Modul haben.. diese Modul will ich all DLL exprotieren und ich einem C Programm verwenden..
Die problematik liegt darin, das ich ja in C keine Klassen habe, und ich weis nich genau , ob ich aus einem C++ Code generierte DLL in einem C Programm verwende.......
Müsste gehen oder? kenn mich nich so aus
-
Da kommst Du bestimmt selbst drauf:
Welchen Header bindest Du in Dein C-Programm ein ? Was soll da drin stehen ? Was soll der C-Compiler damit machen ? ...
Gruß,
Simon2.
-
Hallo
Gar nicht. C kann nicht mit C++ Klassen umgehen. Du must dafür ein C-Interface in die DLL stecken um die C++ Klassen zu wrappen.
bis bald
akari
-
mach mal ein Beispiel.. akari.. sorry.. wenn ich so Anfängermäsig frage
-
Hallo
Nehmen wir mal an du hast so eine Klasse
class IntBuf { public : IntBug(int zahl) : m_zahl(zahl) {}; int GetZahl() {return m_zahl;}; private : int m_zahl; };Um diese Klasse aus einer DLL heraus für C verfügbar zu machen must du dafür ein C-Interface schreiben und in die DLL packen. Dazu betrachtest du die Instanzen der Klasse an sich als Speicherblöcke, die per Handles verwaltet werden
typedef void* c_IntBuf; c_IntBuf CreateIntBuf(int zahl) { return reinterpret_cast<c_intBuf>(new IntBug(zahl)); } int GetZahl(c_IntBuf intbuf) { return reinterpret_cast<IntBuf*>(intbuf)->GetZahl(); } void FreeIntBuf(c_IntBuf intbuf) { delete reinterpret_cast<IntBuf*>(intbuf); }Diese neuen Funktionen können nun von der DLL in C-Manier exportiert werden (extern C...) und von jeder anderen DLL-fähigen Entwicklungsumgebung verwendet werden, auch C
bis bald
akari
-
/* DLL */ extern "C" int meineCFunktionInCpp() { // mach was C++ mässiges Klasse k; k.Irgendwas( new Klasse2 ); k.Irgendwas( new Klasse3 ); k.Aufraeumen(); } /* C-Programm */ int main(void) { meineCFunktionInCpp(); }EDIT:
Ok, etwas abstrakter als akaris, und ausserdem viel zu spät...
-
[edit: zu spät]
-
Hallo
@LordJaxom : Ich habe eben gezeigt wie Klassen direkt gewrappt werden, du degegen wie zusammenhängende Funktionalität. Hat beides seine Vor- und Nachteile.

bis bald
akari
-
Hi,
man darf aber nicht vergessen, dass man eben mit C-Mitteln nicht alles abbilden kann, was C++ kann. Bei Vererbung, templates, overloading, accesspecifier, .... ist da nicht viel oder nur mit einer Menge Fingerbrechen zu machen.
... und exceptions muss man sowieso immer alle fangen und in C-Fehlerhandling umwandeln.Gruß,
Simon2.