ich arbeite mit MS Visual C++ V6 unter NT und möchte von mir erstellte Klassen in eine lib bzw. dll exportieren.
Kann mir jemand sagen wie ich das mache?
Ich würde das gerne machen, ohne meinen code besonders verändern zu müssen wenn’s geht.
Darüber hinaus habe ich gehört, dass es nicht möglich ist, statische Variablen zu verwenden. Kann man das umgehen?
Leg’ Dir einfach mit VC++ mal ein DLL-Projekt an (Win32 Dynamic-Link Library) und lass’ Dir ein paar Beispiel-Exports generieren (unterster Radio-Button, „A DLL that exports some symbols“). Dann hast Du Beispiele, an die Du Dich halten kannst. Das schaffst Du dann.
Das wichtigste ist eigentlich, dass Du vor Symbolen, die Du exportieren willst, ein Makro schreiben musst. VC++ definiert das in der Beispiel-Datei automatisch fuer Dich, es sieht aber in etwa so aus (Namen sind natuerlich evtl. anders):
Jetzt musst Du vor jedes zu expoertierende Symbol TESTDLL_API schreiben:
// This class is exported from the testdll.dll
class TESTDLL\_API CTestdll
{
public: CTestdll(void); // TODO: add your methods here.
};
Was auch noch wichtig ist: Speicher kann nur von der DLL freigegeben werden, in der er reserviert wurde. Wenn Du in Deiner DLL mit new Speicher alloziierst, dann muss das delete auch in einer Funktion dieser DLL stehen. Sonst gibt es Exceptions oder Speicherloecher.
Das Projekt generiert dann einmal eine DLL, die muss dann natuerlich fuer die EXE erreichbar sein, und eine LIB, die Du in Dein EXE-Projekt einbinden musst, genau, wie jede normale LIB.
Soweit ich weiß, kann man doch in „Win32 Dynamic-Link Library“ keine Klassen implementieren, sondern nur C-Code! Erst bei MFC-Erweiterungs-Dlls ist dies möglich!
Soweit ich weiß, kann man doch in „Win32 Dynamic-Link Library“
keine Klassen implementieren, sondern nur C-Code! Erst bei
MFC-Erweiterungs-Dlls ist dies möglich!
Ich weiss nicht, woher dieses Geruecht kommt, ich habe es schon einmal gehoert. Bevor man so etwas in die Welt setzt, sollte man vielleicht erstmal ausprobieren, ob es geht oder nicht. Dann kaeme man naemlich zu der Einsicht, dass es geht.
Ich weiss nicht, woher dieses Geruecht kommt, ich habe es
schon einmal gehoert. Bevor man so etwas in die Welt setzt,
sollte man vielleicht erstmal ausprobieren, ob es geht oder
nicht. Dann kaeme man naemlich zu der Einsicht, dass es geht.
Hallo Mathias,
also ich habe auch noch nie davon gehoert, dass man
Klassenimplementierungen ueber eine DLL anbieten kann. Da Du Dir
ja so sicher warst, habe ich dann mal folgenden Code erstellt.
Zunaechst die DLL:
Das projekt zum Testen der DLL bindet dann wie ueblich die .lib-
Datei ein und der Compiler-Schalter BUILD_DLL wird nicht mehr
definiert. Das Hauptprogramm sieht dann wie folgt aus:
// main.cpp: implementation of main
///////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "std\_stl.h"
#include
#include "..\Object.h"
void main(void)
{
CObject obj1("Object1");
cout
Beim kompilieren der DLL oder des des hauptprogramms erhalte ich
folg. Warnung:
h:\c++\classdll\object.h(25) : warning C4251: 'm\_id' : class 'std::basic\_string,class std::allocator \>' benoetigt eine DLL-Schnittstelle, die von Clients von class 'CObject' verwendet wird
was immer das auch heissen mag. Beim Ausfuehren des Programms
crasht es beim Aufruf des Destruktors von CObject. Also entweder
mache ich etwas falsch oder das geht doch nicht mit Klassen und
DLL's?
Gruss Rolf
ohne jetzt code parat zu haben: Es geht, ich habe bei einer alten Firma c++ (MVC, stl-konstrukte usw…) über DLL-Grenzen hinweg ausgetauscht. Es gibt auch keinen Grund, warum es nicht gehen sollte. Zu beachten aber ist (und das ist der Grund, warum es COM/CORBA usw. gibt) das:
C++ die interne Struktur von Objekten nicht vorgibt. Wie zB virtual implementiert ist oder nicht usw.
deshalb das namemangling zuwischen 2 Compilern unterschiedlich ist, damit sich eine MS VC-DLL und eine GCC-DLL ja nicht untereinander „verständigen“ können - denn das wäre fatal!
Also, wenn man C+±DLLs schreiben will, dann nur für
am besten eigen Projekte, sonst hat man grosse update probleme!
denselben Compiler (zwingend!)
Seht mal bei trolltech ins FAQ zu QT, da steht was dazu.
MfG Diez