Klasse aus Dll exportieren / Nicht aufgeloester Verweis

hallokatze

Grünschnabel
Hallo ,

ich versuche seit einer weile ein programm zuschreiben , das in eine DLL und eine exe aufgeteilt werden soll.
die klasse wird dazu in einer dll untergebracht und es soll an mit hilfe der anwendung darauf zugeriffen werden können:
___________________________________
Code von Klasse.h

#ifndef _Klasse_
#define _Klasse_

#ifdef __dll__
# define DLLEXPORT __declspec(dllexport)
#else
# define DLLEXPORT __declspec(dllexport)
#endif

class DLLEXPORT Klasse
{
public:
Klasse();
void text();

private:
float* koeff;

};

#endif


___________________________

Code von Klasse.cpp


#define __Klasse__


#include <windows.h>
#include "Klasse.h"
#include <iostream>


Klasse::Klasse()
{
}

void Klasse::text()
{
}


BOOL WINAPI DllMain (HINSTANCE hInstance,DWORD fdwReason,PVOID pvReserved)
{
return TRUE;
}

______________________________________

Code der anwendung Anwendung.cpp

#include "Anwendung.h"
#include <iostream>
#include <windows.h>


void main(void)
{
float a[2];
a[0] = 3;
a[1] = 4;

HINSTANCE hDll = NULL;


hDll = LoadLibrary( "Klasse.dll" );

Klasse p();

}
____________________

das problem ist ein compiler fehler:


error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall Klasse::Klasse( )" (0Klasse@@QAE@QAMH@Z)


was kann ich da tun?
Wär echt toll wenn mir jmd sagen könnte was da noch fehlt das der fehler weggeht
Ich programmiere mit visual studio 2008


gruß

halloKatze
 
Hm der kennt die Deklaration der Klasse so doch überhaupt nicht? Davon mal abgesehen das runtime-dlls und klassen so nicht funktioniert.
 
Hallo,

guck mal in die definition von DLLEXPORT ;)
Beide Definitionen sind gleich.

Gruß
Anfänger

Edit:

Außerdem musst du einen Header aus der DLL includen, der dem Programm sagt das es die Klasse gibt.
Außerdem warscheinlich noch ne .lib.

Dann sollte alles klappen ;)
 
Zuletzt bearbeitet:
Hallo halloKatze,

wie schon gesagt wurde, eine Klasse kannst du auf diese Weise nicht exportieren. Du kannst entweder eine Funktion oder eine statische Methode der Klasse exportieren. Außerdem ist LoadLibrary() nur die halbe Miete: Anschließend musst du dir mit GetProcAdresse() einen Zeiger auf die exportierte Funktion bzw. Methode holen, mit dem du dann arbeiten kannst. Wie die exportierten Namen deiner DLL heißen bekommst du mit dem Programm "depends.exe" heraus. Das sollte Bestandteil des Visual Studio sein. Alternativ kannst du auch eine def-Datei zu deinem DLL-Projekt hinzufügen und damit die Namen festlegen.

Gruß
MCoder
 
hm aber ich bin mir ziemlich sicher dass das einer schon mal lauffähig eine klasse in eine dll exportiert hat. die dll hat er geladen . GetProcAdresse() hat ich zwar schonmal verwendet aber ich weiß nicht genau was ich als zweiten parameter (string) mitgeben soll. Ich weiß leider gar nicht wie ich mit depends.exe arbeiten soll.

es fehlt warscheinlich eine lib die ich nicht eingebunden habe... könnte ich villeicht ein beispiel mit pfad bekommen wie das geht


gruß

HalloKatze
 
Hallo halloKatze,

wenn du das über eine Import-Library (lib) lösen willst, brauchst du kein LoadLibrary() und GetProcAddress(). Dann wird die DLL mehr oder weniger statisch mit dem Programm verbandelt. Eine Import-Library (name-der-dll.lib) wird beim Erstellen des Programmes automatisch mit erzeugt. Schaue mal in das Ausgabeverzeichniss deines Compilers.
Diese Lib muss dem Programm, welches die DLL nutzt, hinzugelinkt werden. Die entsprechende Einstellung wird bei den Linkeroptionen deiner Entwicklungsumgebung vorgenommen. Außerdem muss die Headerdatei "Klasse.h" mit eingebunden werden. Dann musst du aber noch den von Anfänger92 genannten Fehler korrigieren: Im else-Zweig muss "... __declspec(dllimport) " stehen.

Gruß
MCoder
 
Hallo,

mit dem Tipp hats endlich funktioniert = ) vielen dank !

aber ich hätte noch eine letzte frage:

Mal angenommen ich würde das programm weiterbauen, wenn ein ein setup baue und es auf einem anderen pc installieren will, muss ich dann nur die dll und die exe verpacken oder braucht der auch die lib dazu


gruß
Hellokitty
 
Zurück