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

26.08.2008, 17:09

[Snippet] C++ DLL-Class

Beschreibung
Einfaches C++-Interface um das Arbeiten mit Dlls zu vereinfachen. Ist für Anfänger gedacht, alle anderen sollten das selber in zwei Minuten stehen haben.

Code (Windows OS)

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
30
31
32
33
34
35
36
37
38
#if !defined (LIBRARY_HPP__INCLUDED)
#define LIBRARY_HPP__INCLUDED

#pragma once

#include <windows.h>
#include <string>

namespace winapipp
{
    struct Library
    {
        Library(std::basic_string<TCHAR> const& file)
            : m_module(::LoadLibrary(file.c_str()))
        {
            if (!m_module) throw std::invalid_argument("invalid library file");
        }
        
        virtual ~Library()
        {
            ::FreeLibrary(m_module);
        }

    public:
        template<typename function_type>
        inline function_type load_function(std::string const& name)
        {
            function_type temp(static_cast<function_type>(::GetProcAddress(m_module, name.c_str())));
            if (temp == NULL) throw std::invalid_argument("unknown function specifier");
            return temp;
        }

    private:
        ::HMODULE m_module;
    };
}; // winapipp


#endif // LIBRARY_HPP__INCLUDED


Code(Plattformunabhängig)

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#if !defined (LIBRARY_HPP__INCLUDED)
#define LIBRARY_HPP__INCLUDED

#pragma once

#ifdef _WIN32
    #include <windows.h>
#else // not Windows (r) OS

    #include <dlfcn.h>
#endif // OS


#include <string>

namespace winapipp
{
    struct Library
    {
        Library(std::string const& file)
#ifdef _WIN32
            : m_module(::LoadLibraryA(file.c_str()))
#else // not Windows (r) OS

            : m_module(::dlopen(file.c_str(), RTLD_LAZY))
#endif // OS

        {
            if (!m_module) throw std::invalid_argument("invalid library file");
        }
       
        virtual ~Library()
        {
#ifdef _WIN32
            ::FreeLibrary(m_module);
#else // not Windows (r) OS

            ::dlclose(m_module)
#endif // OS

        }

    public:
        template<typename function_type>
        inline function_type load_function(std::string const& name)
        {
#ifdef _WIN32
            function_type temp(static_cast<function_type>(::GetProcAddress(m_module, name.c_str())));
#else // not Windows (r) OS

            function_type temp(static_cast<function_type>(::dlsym(m_module, name.c_str())));
#endif // OS

            if (temp == NULL) throw std::invalid_argument("unknown function specifier");
            return temp;
        }

    private:
#ifdef _WIN32
        ::HMODULE   m_module;
#else // not Windows (r) OS

        void*       m_module;
#endif // OS

    };
}; // winapipp


#endif // LIBRARY_HPP__INCLUDED
... so, dann hast du das auch drin ;) Das geht aber wesentlich eleganter :D
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

3

26.08.2008, 22:06

So, damit ist dein Traum erfüllt.
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

26.08.2008, 22:26

Zitat von »"Deviloper"«

So, damit ist dein Traum erfüllt.


Platformunabhängig ist das trotzdem nicht.
@D13_Dreinig

Anonymous

unregistriert

5

27.08.2008, 08:15

David_pb
Korrekt, vorallem da auch in beiden "Implementierungen" nicht die jeweiligen Eigenschaften von dl-Funktionen und DLL-Funktionen beachtet werden. Ich würde daher diese Klasse allein schon aus diesen Gründen nicht benutzen, da hier einfach angenommen wird das es äquivalente Gegenstücke gibt und diese annahme ist schlichtweg falsch.

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

6

27.08.2008, 10:01

Also so wie ich das sehe, sollte das Snippet doch auf Win32 und POSIX konformen Systemen funktionieren? Ich hatte das bisher immer nur unter Windows gemacht und finds deswegen echt klasse mal ein Anschauungsbeispiel für POSIX Systeme zu haben, ohne mich dafür irgendwie angestrengt haben zu müssen. Wenn doch nur alle Träume so leicht in Erfüllung gehen würden.

Danke Deviloper!

Anonymous

unregistriert

7

27.08.2008, 10:22

Klar geht das, aber auch nur weil es so "zusammengeschustert" ist, damit es läuft. z. B. existiert keine Fehlerüberprüfung o. Ä. auch das RTLD_LAZY macht mir mehr als nur Magenschmerzeln. static_cast in load_function und am ende der Vergleich auf null. Man kann nie sicher sein ob ein cast richtig läuft, gerade bei sowas.

Dazu fehlt unicode-Support. Ich sehe nicht ein unter Windows noch ANSI zu benutzen, nur weil jemand seine Klasse nicht richtig auf Unicode umsetzt.

Was ich auch sehr dufte finde: Im Konstruktor wird auf NULL per ! geprüft, in load_function direkt mit == NULL.

Ich finde diese Klasse sehr lieblos, da sie meiner Meinung nach in 10 Minuten zusammengeklatscht wurde und viele Dinge links liegen gelassen wurden.

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

8

27.08.2008, 13:42

Ich finds blöd, dass ihr das hier so niederredet. Klar mag es da noch Dinge zu verbessern geben, aber es ist eben nur ein Schnippsel und wenn ich jetzt eben mal in C eine Library laden müsste könnte ich jetzt genau hier sehen welche Methoden ich brauche. Das einzige was ihr durch eure überzogene Kritik erreicht, ist, dass hier irgendwann gar keiner mehr was postet.

Anonymous

unregistriert

9

27.08.2008, 14:08

rewb0rn
maybe, aber selbst ein Snippet sollte von hoher Qualität und Güte sein. Denn Snippets werden leider viel zu oft ohne Nachdenken benutzt - was ordentliche Fehler verursacht und vorallem: kosten!

Daher:
Hier paar Infos dazu raussuchen zu den dl-Funktionen und die Eigenenheiten Einbauen, dann ist das Script super.
http://publib.boulder.ibm.com/infocenter/systems/index.jsp?topic=/com.ibm.aix.basetechref/doc/basetrf1/dlopen.htm

Selbes gilt ebenfalls für DLLs.

10

27.08.2008, 14:24

Kritik gehoert dazu! Leider bietet dieser Code-Schnipsel keinerlei Mehrwert. Er ist wie ein Stueck rohes Fleisch, dass lieblos Hunden zum Fressen vorgeworfen wird. Gerade weill sie fuer die Oeffentlichkeit und explizit fuer Anfaenger gedacht ist, sollte man sich besonders viel Muehe geben.

Zitat

Einfaches C++-Interface um das Arbeiten mit Dlls zu vereinfachen.

Zitat

C eine Library laden müsste könnte ich jetzt genau hier sehen welche Methoden ich brauche

Keine Ahnung wie das bei DLLs ist, aber normalerweise habe ich einen Header und mit gcc ... -lSDL linke ich gegen die libSDL.so, die beim Starten der Anwendung automatisch (dynamisch) geladen wird. Ich brauche keine Methoden extra.

Ich weiss zwar, was mit dem Code-Schnipsel bezweckt wird, aber hier lernt man etwas mehr:
http://tldp.org/HOWTO/html_single/C++-dlopen/
http://ehuss.com/shared/
http://www.linuxjournal.com/article/3687
http://www.ddj.com/cpp/184401900?pgno=1
ach ja: man dlopen

Desweiteren sind mir noch einige Eigenheiten aufgefallen:

Quellcode

1
2
3
4
5
6
struct Library
{
  // Methoden
  public:
  // mehr Methoden
}
Ist irgendwie komisch. Ich selbst verwende struct wirklich nur noch fuer Strukturen nicht fuer Klassen, aber das kann jeder halten wie er will. Auf Exceptions haette ich verzichtet. Wenn Bibliotheken z.B. vom Benutzer geladen werden koennen, so ist es ganz normal, wenn er sich verschreibt. Ich haette mich am fstream interface orientiert, mit open, close und true/false als Rueckgabewert.

Werbeanzeige