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 :
    IMPORTUER

    Hast 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.


  • Mod

    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...


Anmelden zum Antworten