Import von einer Klassen Methode aus einer DLL
-
hi@all erstmal
so ich habe mit VS2008 folgendes Problem:
ich habe hier eine DLL (und .lib) vorliegen und möchte die Funktionen und Methoden gerne implementieren.
die Funktionen laufen ohne Probleme, allerdings habe ich Probleme beim Import einer Klassen bzw deren Methoden.
Die Klasse selbst wird nicht exportiert, sondern nur deren Methoden (Konstruktoren usw.)wenn ich es importieren will:
#define DllImport __declspec( dllimport ) #include <windows.h> #include <stdio.h> DllImport char const * getTitle(int); DllImport Feat::Feat(unsigned char *,int,int,unsigned char *,double); DllImport Feat::Feat(unsigned char *,int,int,int *,double);
funktionieren das getTitle ohne Probleme, allerdings bei den Methoden von Feat kriege ich folgende Probleme:
1>c:\visual studio 2008\projects\imageread\imread\main.cpp(5) : error C2653: 'Feat': Keine Klasse oder Namespace 1>c:\visual studio 2008\projects\imageread\imread\main.cpp(5) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt. 1>c:\visual studio 2008\projects\imageread\imread\main.cpp(6) : error C2653: 'Feat': Keine Klasse oder Namespace 1>c:\visual studio 2008\projects\imageread\imread\main.cpp(6) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
what 2 do?
-
Hallo,
du kannst einfach eine DLL erzeugen in welcher du eine
Belibige Klasse implizierst.Dann mußt Du im primitivsten Fall einfach das Header dieser
hinzugefügten Klasse in dein Projekt includen.Dazu mußt du das Header in deiner implizierten klasse
etwas verfeinern:#ifdef IMPORTUER #define DLLEXPORTUER _declspec(dllexport) #else #define DLLEXPORTUER _declspec(dllimport) #ifdef _DEBUG #pragma comment(lib, "ObjDetectD.lib") #else #pragma comment(lib, "ObjDetect.lib") #endif #endif class DLLEXPORTUER CBitPic : public CLabeling { public: CBitPic(void); ~CBitPic(void); }
Weil es gild _declspec(dllexport) ist eine direktive für den Linker
und wird veranlassen das die DLL ihre Methoden mit Labels veröffentlicht.Hingegen muß deine Anwendung dem Linker vermitteln, das Du externe
Refrenzen importieren möchtest, dazu hat das Header diesen Schalter oben :
IMPORTUERHast du den vor dem includen des headers mit #define IMPORTUER
definiert, wird das Header seinerseits bei deinem #include "dllheader.h"
veranlassen das alles als IMPORT verstanden wird.Die lib linkt sich über das header selber siehe #pragma direktive:
Möchtest Du jedoch das zur laufzeit die DLL als PlugIn geladen wird
(late binding) kannst Du so nicht vorgehen, das führt direkt zu COM
bzw dessen nachbildung durch zeigerrefrenzen auf bekannte Klassen,
da diese nicht instanziert sind, arbeitet man mit virtuellen
überlagerungen, das ist auch einfach machbar, aber ActiveX und Com
ist da der Konfirme weitere Schritt.
-
Du kannst keine Kosntruktoren aleine außerhalb der Klasse deklarieren.
DllImport Feat::Feat(unsigned char *,int,int,unsigned char *,double); DllImport Feat::Feat(unsigned char *,int,int,int *,double);
Dieser Code ist eine Forward Deklarattion für eine Funktion in einem Namespace und nicht für einen Konstruktor.
Du misst die Klasse exportieren...