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

moritz31

Treue Seele

  • »moritz31« ist der Autor dieses Themas

Beiträge: 259

Wohnort: Hessen

Beruf: Student

  • Private Nachricht senden

1

16.09.2011, 23:40

Fragen zu DLLs

Hey
ich habe wie oben gefragt ein paar kleine Fragen zu Dll's.

1. Was ist eigentlich der Vorteil von dll's. Also man könnte sich ja auch einfach sich ne hpp und cpp schreiben und diese dann in das projekt einbinden.

2.Es hat mich mal gereitzt mir ne kleine Dll mit Mathefunktionen zu schreiben. Hab dann en Tutorial gefunden es nach dem Schema gemacht nur leider scheiße gelaufen.
Es funktioniet nicht :/

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Calculate
    {
    public:

        static __declspec(dllexport) double Add(double a, double b);

        static __declspec(dllexport) double Subtract(double a, double b);

        static __declspec(dllexport) double Multiply(double a, double b);

        static __declspec(dllexport) double Divide(double a, double b);

        static __declspec(dllexport) double Radical(double a, double n,double m);

        static __declspec(dllexport) double Increase(double a, double b);

        static __declspec(dllexport) double RoundUp(double a);

        static __declspec(dllexport) double RoundDown(double a);

        static __declspec(dllexport) double Round(double a);

        static __declspec(dllexport) double Rest(double a, double b);

        static __declspec(dllexport) double Ammount(double a);

    };


Hier der Code des headers, die dll und ne lib datei enstehen auch.
Bin dann so verfahren wie bei SFML. Aber die Funktionen können net gefunden werden :(
Kann jemand sagen was ich falsche gemacht habe.
In der cpp sind die funktionen ganz normal deklariert.


gruß moritz

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

16.09.2011, 23:51

Einfach nur dllexport hinzuschreiben funktioniert nicht.
Wenn Du die DLL kompilierst, muss es dllexport sein, aber wenn Du sie benutzt, muss es dllimport sein.
Normalerweise löst man sowas mit einem Makro, das beim Kompilieren der DLL den einen Wert annimmt und ansonsten den anderen.

Vorteil von DLLs?
- Du kannst sie theoretisch später austauschen, wenn Du z.B. einen Fehler darin beseitigt hast, und musst nicht die ganze Anwendung austauschen.
- Mehrere Anwendungen können dieselbe DLL nutzen, also weniger doppelter Code.

PS:
Ich hoffe, es ist Dir klar, dass eine solche "Mathe-Library" totaler Quatsch ist.
Wer will schon eine Funktion zum Addieren von zwei Zahlen aufrufen, wenn er einfach x + y schreiben kann?
Außerdem sind solche Aufrufe langsam, weil DLL-Funktionen vom Compiler nicht inlined werden können.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

16.09.2011, 23:51

1. Was ist eigentlich der Vorteil von dll's. Also man könnte sich ja auch einfach sich ne hpp und cpp schreiben und diese dann in das projekt einbinden.

Dlls werden zur Laufzeit gebunden und nicht zur Compiletime. Wenn du z.B. an einer Funktion deiner Mathe-dll etwas änderst, dann brauchst du nur die dll neu kompilieren und die exe würde autom. die neue Funktion verwenden, ohne dass du sie anfassen musst. Da dlls dynamisch geladen werden können, kannst man damit z.B. Plugins realisieren. Mehrere Anwendungen können die selbe dll verwenden, wobei die dll tatsächlich nur einmal im Speicher liegen muss, für Dinge wie z.B. die WinAPI ist das essentiell.

2.Es hat mich mal gereitzt mir ne kleine Dll mit Mathefunktionen zu schreiben. Hab dann en Tutorial gefunden es nach dem Schema gemacht nur leider scheiße gelaufen.
Es funktioniet nicht :/

Das da sind keine normalen Funktionen, sondern statische Methoden. Du müsstest deine Klasse exportieren. Bedenke auch, dass die Deklaration in der exe, die die dll verwenden soll, dllimport statt dll export stehen muss.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (17.09.2011, 00:00)


moritz31

Treue Seele

  • »moritz31« ist der Autor dieses Themas

Beiträge: 259

Wohnort: Hessen

Beruf: Student

  • Private Nachricht senden

4

17.09.2011, 00:36

Ja mir is schon klar das die Libary sinnlos ist, ich wollte böoß etwas sehr einfaches nehmen um erstmal die Funktion
von einer Dll zu verstehen. Kennt jemand vielleicht ein gutes Buch oder Tutorial.

5

17.09.2011, 01:00

Du legst einen Hauptheader an.
Dort schreibst du rein:

C-/C++-Quelltext

1
2
3
4
5
#ifdef MEINE_LIBRARY_WIRD_KOMPILIERT
 #define MEINE_LIBRARY_API _declspec(dllexport)
#else
 #define MEINE_LIBRARY_API _declspec(dllimport)
#endif


Diese Datei bindest du überall ein, denn du willst bestimmt alles in deiner DLL haben, denn sonst lässt der Compiler einfach was aus.
Doch Stop! Noch passiert nichts!

C-/C++-Quelltext

1
2
3
4
class MEINE_LIBRARY_API Calculate
{
 //...
};


Nun musst du noch dafür sorgen, dass nur im DLL-Projekt MEINE_LIBRARY_WIRD_KOMPILIERT definiert ist. Das geht in den Projekteinstellungen unter Compiler/Präprozessordefinitionen. Dadurch setzt der Compiler dann dllexport ein, und wenn es nicht gesetzt ist (im anderen Projekt, das die DLL benötigt), wird dann dllimport benutzt.

So hast du vor deiner Klasse immer nötigen Export/Import stehen.

MfG
Check (& David ;))

PS: Sollte was falsch sein korrigiert mich bitte. ;)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

17.09.2011, 07:32

PS: Sollte was falsch sein korrigiert mich bitte. ;)

Ich war mal so frei und hab deinen Beitrag bearbeitet.
Da fehlte die Variable hinter dem #ifdef, außerdem musst Du dafür sorgen, dass diese Variable nur dann definiert ist, wenn die DLL kompiliert wird.

moritz31

Treue Seele

  • »moritz31« ist der Autor dieses Themas

Beiträge: 259

Wohnort: Hessen

Beruf: Student

  • Private Nachricht senden

7

17.09.2011, 13:49

So habe nun alles so gemacht wie es Checkmateing gesagt hat.
Header erstellt bei Class den namen hingeschrieben des static __declspec(dllexport) zeugs entfernt
des Präprozessor dings da hinzugefügt. Dann hab ich Projektmappe neu erstellen gemacht und
hatte eine Lib und eine dll datei(waren noch zwei andere dateitypen aber glaub die sind nicht wichtig)

jetzt habe ich ein neues Projekt gemacht und versucht auf die DLL zu zu greifen.
Entweder bin ich zu blöd oder ich habe immer noch etwas falsch gemacht es klappt nämlich immer noch nicht

edit: korrigiert

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

8

17.09.2011, 13:51

Muss es nicht "__declspec" heißen? :o
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

9

17.09.2011, 19:59

Also bei mir klappt´s auch mit nur einem Unterstrich. O.o
Das zugreifen auf die DLL finde ich persönlich auch gemein, weil es einfacher ist als man denkt. Aber man muss erst mal merken, dass man, wie wenn man SFML oder irgendeine andere Engine verwendet, bei jedem Einbinden diverser Engine auch eine gewisse DLL in das Projektverzeichnis muss. Mit unserer eigenen DLL ist das nicht anders.
Die Header-Dateien der DLL müssen bekannt gemacht werden und dann inkludierst du alle nötigen Header.
Das war´s eigentlich schon.
A.DLL in Projekt B legen, AA.hpp und AB.hpp inkludieren, Methoden von AA.hpp und AB.hpp verwenden.
Ach so: Nicht vergessen deine DLL bei Linker->Eingabe auch zu linken!!

MfG
Check

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

10

17.09.2011, 20:22


Ach so: Nicht vergessen deine DLL bei Linker->Eingabe auch zu linken!!


Nicht die DLL wird gelinkt, sondern die beim Kompilieren der DLL erstellte LIB. Diese musst du bei den Linkereinstellungen eintragen, sofern du die DLL nicht zur Laufzeit per WinAPI lädst.

Werbeanzeige