Klassen aus DLL importieren und im Programm nutzen

fbfeix

Erfahrenes Mitglied
Hallo

Ich versuche jetzt schon seit ein paar Tagen eine (selbstgeschriebene) DLL einzubinden.
Leider bisher ohne Erfolg. :(
(Die dll wird erfolgreich kompiliert)
Allerdings benötige ich die darin enthaltenen Klassen.
Google spuckt zum Thema klassen aus dll's benutzen nichts wirklich Nützliches aus.
Ich hoffe ihr könnt mir helfen.
 
Hi und Willkommen bei tutorials.de :)

Welchen Compiler verwendest du?
Hast du die Klassendefinition auch in der .h-Datei?
Welche Fehlermeldungen kommen?
 
Dev-C++
Ja habe ich

habs schon Unterschiedlich probiert

aktuell bin ich gerade bei dem:

Code:
#include <iostream>
#include <windows.h>
#include <sstream>

using namespace std;

DLLImport("gde.dll");

#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */



class __declspec ( dllimport ) Point;

Fehler:
Zeile 7:
- ISO C++ forbids declaration of DLLIMPORT with no type
- invalid conversion from 'const char*' to 'int'

Zeile 3:
- syntax error before ';' token

Kann auch sein das der Code komplett falsch ist.
Dann bitte ich um Erklärung und Korrektur.
 
Zuletzt bearbeitet:
DevCPP ist kein Compiler. Nur ein grafischer Aufsatz, der mit
verschiedenen Compilern verwendet werden kann. (Noch dazu veraltert).
Die Frage bleibt: Welcher Compiler? gcc?

C++:
#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */
Brauchst du das irgendwo? Das sollte weg. Verwirrt sowieso nur, beides mal "Import".

C++:
DLLImport("gde.dll");
Das ist definitiv falsch. Schon deshalb, weil du eine Funktion nicht irgendwo im leeren Raum aufrufen kannst.
Deshalb die Compilerfehler. Aber auch sinnmäßig geht da was daneben:
Beim ordentlichen Erstellen einer DLL bekommst du eine .dll und eine .lib. Dazu muss noch eine .h-Datei geschrieben werden.
Das mit .h passt prinzipiell, aber: Statt die dll irgendwo im Code anzugeben musst du die lib in den Linkereinstellungen eintragen. Die dll wird dann nur zum Programmstart benötigt und muss auch beim Weitergeben vom Programm mitgegeben werden. Die lib und h braucht man nur zum kompilieren.

Und zu
C++:
class __declspec ( dllimport ) Point;
Da gehört nicht nur der Name, sondern die komplette Klasse rein. Allerdings ohne Funktionsinhalt.
zB.
C++:
class asd
{
    protected:
        int i;
    public:
        void funktion(int x);
}
Vielleicht postest du auch mal den DLL-Code (kannst auch alles zuasmmen als Zip hier raufladen).

Allgemein ist eine Klasse in nativen DLLs nicht wirklich einheitlich zwischen den Compilern gehandhabt.
Ich glaubs zwar nicht, aber es könnte auch sein dass dein Compiler da gar nicht mitmacht.

Zum Forum noch was: Statt [code]...[/code] kannst für C und C++ auch [code=cpp]...[/code] verwenden. Dann wirds noch farbig dazu.

Gruß
 
Zuletzt bearbeitet:
achso ja gcc

In den Linkereinstellungen ist die Datei bereits enthalten.

Danke für die Information.

Habs jetzt so verändert:

C++:
#include <iostream>
#include <windows.h>
#include <sstream>

using namespace std;


class __declspec ( dllimport ) Point
{
public:
    Point();
    Point(float x, float y, float z);
    float X;
    float Y;
    float Z;
    
    Point operator+(Point p); 
    Point operator-(Point p);
    Point operator++();
    Point operator--();
    Point operator=(Point p);
    Point operator+=(Point p);
    Point operator-=(Point p);
    bool operator==(Point p);
    bool operator!=(Point p);
    Point operator!(); //negierung (*-1)
    Point operator&(Point p);
    Point operator|(Point p);
    Point operator~(); //bitweise negation
private:  
};

int main()
{
    Point p;
    
    
    system("PAUSE");
    return 0;
}

Hier gibt er mir dann diesen Fehler aus:
[Linker error] undefined reference to 'Point::point()'
 

Anhänge

  • DLL.zip
    146,2 KB · Aufrufe: 14
Hmm...damit sind mir die Ideen derzeit ausgegangen...
vielleicht fällt mir ja noch was ein...
 
Hallo,

Hab mir das Projekt angeschaut das du hier hochgeladen hast. Kann es sein das du im Projekt vergessen hast BUILDING_DLL zu definieren. Ich gebe zu ich kenn mich mit Dev-CPP jetzt nicht gut aus, aber irgendwie hab ich nirgends eine Definition dafür gefunden.

Wenn du BUILDING_DLL beim Kompilieren der DLL nicht angegeben hast, dann werden deine Klassen auch nicht in die DLL exportiert, daher kann dann der Linkerfehler im Hauptprogramm kommen.
 
Zurück