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

30.03.2005, 11:55

.

.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »FOGX« (15.09.2010, 17:27)


weigo

Treue Seele

Beiträge: 234

Wohnort: Deutschland

  • Private Nachricht senden

2

30.03.2005, 12:20

Wenn du ein DLL Projekt machst -> Win32 -> DLL auswählen, statt Win32 Anwendung oder wie auch immer, dann erhältst du nach dem kompilieren eine DLL und eine lib.
Du musst natürlich die nötigen Methoden oder die Klassen per declspec exportieren, am Besten schreibst du dir dafür ein kleines Makro damit der Code in der DLL exportiert wird und in deiner Anwendung wieder importiert wird.
Die lib musst du dann zu deinem Projekt linken. Einfach in den Einstellungen auswählen oder du kannst natürlich sie auch explizit per LoadLibrary laden. Dann empfiehlt sich eine Factory Funktion, die ein Objekt deiner Klasse erzeugt, die in der DLL ist .... du hast doch eine Klasse oder?

Ich lade meine Engine DLLs implizit über die lib Datei.
Aber Plugins für meine Engine explizit über LoadLibrary.
Die DLL muss dann noch in das Projektverzeichnis kopiert werden, da er diese zur Laufzeit laden muss.

Falls du irgendwas nicht verstanden hast, dann frag einfach noch einmal nach. Ich habe dir hier mehr einen groben Überblick über die Möglichkeiten gegeben, da ich nicht weiß wie du deine DLL in deinem Programm lädst.

3

31.03.2005, 09:37

.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »FOGX« (15.09.2010, 17:27)


weigo

Treue Seele

Beiträge: 234

Wohnort: Deutschland

  • Private Nachricht senden

4

31.03.2005, 10:31

Ich habe mit Borland noch nicht gearbeitet und weiß nicht in wie Fern sich die Verwendung von DLLs zu MS VS unterscheidet.

Makro:

Quellcode

1
2
3
4
5
#if defined( IRGENDETWAS_EXPORT )
    #define IRGENDETWAS_API __declspec( dllexpor t)
#else
    #define IRGENDETWAS_API __declspec( dllimport )
#endif

Du schreibst mit diesem Makro nicht mehr explizit __declspec( dllexpor t) vor deine Funktionen, sondern nimmst das Makro IRGENDETWAS_API.
Warum?
Durch das Makro erreichst du, dass die Funktion aus der DLL exportiert wird, dazu musst du noch IRGENDETWAS_EXPORT definieren. Bei VS kann man das in den Projekteigenschaften unter C/C++ -> Preprocessor -> Preprocessor Definitions eintragen. Importierst du nun die DLL in einer anderen Anwendung ( hinzufügen der lib oder durch LoadLibrary ), dann wird die Funktion automatisch importiert. Du musst dort nichts mehr definieren.

Wichtig ist, dass du die .lib hinzufügst und die .dll in das Ausgabeverzeichnis kopierst. Wenn du LoadLibrary verwendest, dann brauchst du die .lib nicht.

Dave

Alter Hase

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

5

31.03.2005, 11:57

Zitat von »"FOGX"«


In der DLL sind nur drei Funktionen, keine Klasse.


du musst die klasse natürlich auch exportieren:

C-/C++-Quelltext

1
class __declspec(dllexport) CMeineKlasse

weigo

Treue Seele

Beiträge: 234

Wohnort: Deutschland

  • Private Nachricht senden

6

31.03.2005, 12:05

Zitat


FOGX hat folgendes geschrieben:

In der DLL sind nur drei Funktionen, keine Klasse.


du musst die klasse natürlich auch exportieren:
Code (C++):

class __declspec(dllexport) CMeineKlasse


Er hat doch geschrieben, dass er keine Klasse hat und die Funktionen exportiert er doch schon.

Dave

Alter Hase

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

7

31.03.2005, 20:16

sry, hatte mir nicht alles durchgelesen und ihn falsch verstanden...

8

01.04.2005, 08:57

.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »FOGX« (15.09.2010, 17:27)


weigo

Treue Seele

Beiträge: 234

Wohnort: Deutschland

  • Private Nachricht senden

9

01.04.2005, 09:33

Also das #endif gehört natürlich dazu, dass hatte ich doch so auch gepostet.

Nochmal zum Verständnis:
Die Namen spielen keine Rolle. Das ist soweit auch OK.
TOLLESDEFINE muss nicht bei den Includes stehen, sonder bei den Preporcessor Definititonen. Ich weiss nicht wie weit Borland das unterstützt, du könntest auch einfach in deinem Projekt ein #define TOLLESDEFINE vor den Aufruf ode am Anfang des Codes posten. Das hätte den gleichen Effekt.
Einfacher ist es aber, wenn du es in den Projekteigenschaften setzen kannst, da es dann auf jeden Fall für das ganze Projekt gültig ist.

Also dein Lade Code sieht für mich sehr merkwürdig aus, dass heißt aber nicht das er falsch ist. Ich vermeide Windows spezifische Makros wie z.B. __stdcall, außer bei __decelspec für die DLLs, da gibt es aber auch Tricks, die zu benutzen und bei andren Platfformen zu ignorieren.

Ich poste dir einfach mal meine Laderoutine:

In der IPlugin Datei habe ich folgendes definiert:

Quellcode

1
2
3
4
5
/// Funktionszeiger
typedef IPlugin* ( *CREATEPLUGIN )();

/// Exportfunktion aus den Plugins
extern "C" __declspec( dllexport ) IPlugin* CreatePlugin();


Aus dem PluginManager:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/// Lädt ein Plugin von einer Datei.
bool CPluginManager::LoadPluginFromFile( const std::string& _rstrFilename )
{
    /// Lädt Plugin
    HMODULE h_dll = ::LoadLibrary( _rstrFilename.c_str() );
    if ( 0 == h_dll )
        return false;

    /// Funktionszeiger holen
    CREATEPLUGIN p_func = ( CREATEPLUGIN )::GetProcAddress( h_dll, "CreatePlugin" );
    if ( 0 == p_func )
        return false;

    /// Plugin erzeugen
    IPlugin*  pcl_plugin = p_func();
    if ( 0 == pcl_plugin )
        return false;

    // irgendwas mit dem pcl_plugin machen :)

    return true;
}


Wie benutzt du eigentlich die Funktion installhook?

Hier ein Beispiel, wie ich die Exportfunktion CreatePlugin benutze:

Quellcode

1
2
3
4
5
/// Exportfunktion.
extern "C" __declspec(dllexport) IPlugin *CreatePlugin()
{
    return new CZipFileSystemPlugin();
}


Diese Funktion erzeugt ein Objekt meiner Plugin Klasse.

Da du keine Klasse hast, musst du wahrscheinlich für alle Funktionen eine solche Exportfunktion schreiben. Aber da bin ich mit jetzt auch nicht ganz sicher, da ich rein OO entwickele und außer der Exportfunktionen keine Funktionen benutze.

Ich hoffe, dass wird dir ein wenig weiterhelfen.

Werbeanzeige