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

1

24.07.2013, 21:58

Dll Dateien(ohne Header und cpp Dateien)

Hey Leute

Habe mir eben mal ein Video angeschaut, wie man eine DLL Datei erstellt, man erkennt so im groben wie er es macht, allerdings bindet er am Ende die main.h ein.
Da Frage ich mich, warum tut er das, andere Spiele haben auch keine .h Dateien mehr im Ordner und funktionieren, wie machen die das denn dann?

C++ Dll

Gruß Leri

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

24.07.2013, 22:45

Unter Windows kannst du DLLs mit LoadLibrary laden und dir dann mit GetProcAddress einen Funktionszeiger auf eine bestimmte von der DLL exportierte Funktion holen.

andere Spiele haben auch keine .h Dateien mehr im Ordner und funktionieren, wie machen die das denn dann?

Eine Header-Datei hat ja sowieso nur für den Compiler eine Bedeutung.
Klar, dass du bei einem gekauften Spiel keine Header-Dateien findest. :wacko:

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

3

24.07.2013, 23:10

Um eine DLL-Datei zu benutzen kannst du sie entweder statisch laden, dann kümmert der Compiler sich darum, die DLL zu laden, oder eben dynamisch über die Winapi mit LoadLibrary. Wenn sich der Compiler darum kümmern soll, brauchst du eine .h und eine .lib-Datei, die dem Compiler und dem Linker sagen, welche Funktionen wo in der DLL sind.

Nach dem Kompilieren brauchst du keine .h und keine .lib-Dateien mehr.

4

25.07.2013, 18:45

hat vielleicht einer von euch einen guten link zu nem Tutorial?^^

Also wenn ichs jetzt recht verstanden habe, werden alle cpp und hpp dateien eingefügt, die dll erstellt damit, und dann kann ich die weglassen?

Weil in dem einen Beispiel erstellt er die dll und muss trotzdem eine main.h einbinden.

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

5

25.07.2013, 18:52

Du erstellst die EXE und die DLL mit der .h und .lib-Datei und danach brauchst du sie nie wieder (außer zum erneuten kompilieren).

6

25.07.2013, 19:38

okay habe jetzt meine dll erstellt, allerdings, bekomme ich sie nicht in mein testproject eingefügt.

DLL.h

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
28
29
#ifndef __Link_H__
#define export extern "C" __dclspec (dllexport)
#define __Link_H__

#include <windows.h>

/*  To use this exported function of dll, include this header
 *  in your project.
 */

#ifdef BUILD_DLL
    #define DLL_EXPORT __declspec(dllexport)
#else
    #define DLL_EXPORT __declspec(dllimport)
#endif


#ifdef __cplusplus
extern "C"
{
#endif

double DLL_EXPORT soma(double a, double b);

#ifdef __cplusplus
}
#endif

#endif // __MAIN_H__



DLL.cpp

C-/C++-Quelltext

1
2
3
4
5
6
#include "main.h"

double DLL_EXPORT soma(double a, double b)
{
    return (double)a+b;
}



mein neues project mit main.cpp

wie kann ich nun die funktion soma darin benutzen und wie linke ich die dll?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

25.07.2013, 19:44

C-/C++-Quelltext

1
2
3
4
HMODULE dll = LoadLibraryA("meine.dll");
typedef double (* SomaPtr)(double, double);
SomaPtr p_soma = reinterpret_cast<SomaPtr>(GetProcAddress(dll, "soma"));
double result = p_soma(47, 11);

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

8

25.07.2013, 19:56

Ich glaube, er will sie statisch einbinden.
Beim kompilieren der DLL müsstest du eine .lib und eine .dll bekommen haben.
In deinem neuen Projekt linkst du dann die .lib-Datei, d. h. du fügst sie in den Linkereinstellungen als Abhängigkeit hinzu.

So kannst du sie dann benutzen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#ifdef BUILD_DLL
#undef BUILD_DLL
#endif
#include "DLL.h"

int main()
{
    std::cout << soma(1.5, 2.5);
    return 0;
}

9

25.07.2013, 20:00

naja ich wollte ungern die lib mit einbinden in CB

Wollte ja ein Project haben, wo ich nur die dll mitliefere und nicht noch die lib dazu :)



Aber das mit HModul dll funktioniert super vielen dank :).

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

10

25.07.2013, 20:43

Wie gesagt, ausliefern musst du nur die exe und die dll, mehr nicht. Solange du kein Pluginsystem schreiben willst, ist die statische methode viel einfacher und übersichtlicher

Werbeanzeige