Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Anonymous

unregistriert

1

29.10.2004, 14:53

Dll-Linkererror

Ich habe eine Dll mit der Klasse CClass und der Funktion GetClass(CClass** ppClass) erstellt.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class EXPORT CClass
{
public:
     int     Init();
     int     Exit();
     
protected:
     BOOL m_bInitialized;
};

extern "C" EXPORT void GetClass(CClass** ppClass)
{
     *ppClass = new CClass;
}



Dann lade ich die Dll und die Funktion mit LoadLibrary() und GetProcAddress(). (wird erfolgreich geladen)
Wenn ich jetzt aber nachdem GetClass() einen Zeiger zurückgegeben hat, CClass::Init() aufrufe, kommt ein Linkererror. Wo ist der Fehler?

2

29.10.2004, 18:40

Wie ist denn EXPORT Definiert? Wenn du ein Symbol aus einer DLL exportieren willst um es z.B. in einer EXE zu benutzen, dann muss es auch in der EXE Importiert werden.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Anonymous

unregistriert

3

29.10.2004, 19:14

C-/C++-Quelltext

1
#define EXPORT __declspec(dllexport)


Wie in die EXE importieren?


P.S.:
Die Header hab ich auch #includet.

Anonymous

unregistriert

4

29.10.2004, 19:19

Ich habe es jetzt auch versucht in der EXE mit __declspec(dllimport) vor der Klasse versucht.

--------------------Konfiguration: dgf - Win32 Debug--------------------
Kompilierung läuft...
exe.cpp
Linker-Vorgang läuft...
exe.obj : error LNK2001: Nichtaufgeloestes externes Symbol "__declspec(dllimport) public: int __thiscall CClass::Exit(void)" (__imp_?Exit@CClass@@QAEHXZ)
exe.obj : error LNK2001: Nichtaufgeloestes externes Symbol "__declspec(dllimport) public: int __thiscall CClass::Init(void)" (__imp_?Init@CClass@@QAEHXZ)
Debug/dgf.exe : fatal error LNK1120: 2 unaufgeloeste externe Verweise
Fehler beim Ausführen von link.exe.

5

30.10.2004, 03:43

Wenn du es nicht Importierst, wie soll der linker dann wissen wo er suchen muss?


Nicht umsonst wird immer das gute alte DLL-Makro erzeugt. In der DLL muss die Klasse exportiert werden. In deiner EXE aber Importieren.

C-/C++-Quelltext

1
2
3
4
5
#if defined(DLL_API)
#   define API __declspec(dllexport)
#else
#   define API __declspec(dllimport)
#endif
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Anonymous

unregistriert

6

30.10.2004, 15:20

Das funktioniert jetzt.
Kann da man irgendwie einen Singleton in die Klasse in der Dll einbauen. Bei mir kommt immer ein Linkererror, wenn ich GetSingleton() aufrufe (in EXE und Dll).

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
class API CClass
{
public:
    ...
    CClass* GetSingleton();

protected:
    CClass* ms_pSingleton;
    ...
};

7

31.10.2004, 16:03

Wenn du mein Makro eins zu eins übernommen hast, kann das auch nicht gehen. Das war ja nett die Lösung, sondern nur ein Beispiel.

Ich schlage vor das du dich noch einmal genauer mit DLL's beschäftigst. Fragen dazu gibt es hier im Forum genügend.

Tipp: Die Define-Konstante "DLL_API" wird vom DLL-Projekt definiert.

PS: Singleton's haben mit deinem Problem absolut gar nichts zu tun. Es geht nur über das Exportieren und Importieren und eine zweite Möglichkeit, die aber nicht angebracht ist.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Anonymous

unregistriert

8

31.10.2004, 16:47

Das ganze sieht so aus und funktioniert!

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
#define _DLL

#ifdef _DLL
#define API __declspec(dllexport)
#else
#define API __declspec(dllimport)
#endif

class API CClass
{
    ...
};


Nun möchte ich aber von z.B. meinem Texurmanager, ohne dass ich beim Initieren einen D3DDevice-Zeiger übergebe, auf das D3DDevice meiner CDirect3D-Klasse zugreifen. Wie geht das?

9

01.11.2004, 17:11

Entweder ist dein D3D Device eine global (ganz schlechte Lösung), es ist eine Static member deines CDirect3D Objektes (schon besser) oder aber du lieferst deinem Textur Manager gleich das ganze CDirect3D Objekt (ist noch besser).

Je nachdem wie dein Design ausschaut ist es noch besser wenn dein CDirect3D-Objekt ein Singleton ist.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Anonymous

unregistriert

10

02.11.2004, 19:08

Wie kann ich den Singleton in der Dll-Klasse erstellen.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
class API CClass
{
public:
        ...
        static CClass* GetSingleton();

protected:
        ...
        static CClass* ms_pSingleton;
};


Wenn ich jetzt über GetSingleton() ms_pSingleton zurückgebe, kommt ein Linkererror, dass ms_pSingleton nicht aufgelöst ist. Ich habe in der *.cpp ms_pSingleton aufgelöst.

C-/C++-Quelltext

1
2
3
4
5
6
Class* CClass::ms_psingleton = NULL;

CClass* CClass::GetSingleton()
{
        return ms_pSingleton;
}




Und muss man alle Funktionen inerhalb der Klasse virtual deklarieren?

Werbeanzeige