Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [CPP] Dynamisches Laden einer Klasse aus einer DLL (https://www.delphipraxis.net/82671-%5Bcpp%5D-dynamisches-laden-einer-klasse-aus-einer-dll.html)

Dunedain 17. Dez 2006 21:18


[CPP] Dynamisches Laden einer Klasse aus einer DLL
 
Hallo,

ich habe, wie der Titel schon sagt, einige Probleme damit, aus einer von mir erstellten DLL eine Klasse zu exportieren. Das DLL Projekt lässt sich fehlerfrei kompilieren, jedoch das einbinden der DLL funktioniert leider nur statisch.

Nehmen wir mal dieses Beispiel (Die Datei ist Bestandteil des DLL Projektes):
Code:
#ifdef __DLL__
#   define DLL_EXP __declspec(dllexport)
#else
#   define DLL_EXP __declspec(dllimport)
#endif
//---------------------------------------------------------------------------
#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include <Classes.hpp>
//---------------------------------------------------------------------------
class DLL_EXP TTest : public TThread
{
private:
protected:
        void __fastcall Execute();
public:
        __fastcall TTest(bool CreateSuspended);
};
//---------------------------------------------------------------------------
#endif
Wie schon erwähnt, lässt sich das Projekt kompilieren und spuckt danach, korrekter Weise eine .dll sowie eine .lib Datei aus. Da ich das ganze dynamisch laden will, kopiere ich den Header der Klasse sowie die dll selbst in das Programm Verzeichnis, welches die DLL verwenden soll. So weit, so gut:
Ich binde also den Header der Klasse in das Formular ein, und versuche die DLL bzw. die Klasse aus der DLL bei einem Button-Press zu laden:
Code:

void __fastcall TformularMain::buttonClick(TObject *Sender)
{

    HINSTANCE lib = NULL;

    try
    {

        /* Bibliothek anfordern */
        lib = LoadLibrary( "TTest.dll" );

        /* Prüfen, ob die Bibliothek geladen werden konnte */
        if( lib )
        {

            TTest *c = NULL;

            try
            {

                /* Wenn diese Zeile auskommentiert wird, lässt es sich das Programm kompilieren
                 **/
                c = new TTest ( true );

            }
            __finally
            {

                delete c;
                c = NULL;

            }

        }
       
    }
    __finally
    {

        FreeLibrary( lib );

    }
}
Leider bekomme ich dann beim Versuch, das ganze zu kompilieren, zwei Fehlermeldungen
"Unresolved External TTest:: referenced from ..."
"Unresolved External __fastcall TTest::TTest( bool ) referenced from ..."

Wenn ich aber die .lib Datei in mein Projekt einbinde, das ganze also statisch linke, funzt alles...

Hat jemand ne Idee, wo mein Fehler liegen könnte?

JasonDX 17. Dez 2006 21:46

Re: [CPP] Dynamisches Laden einer Klasse aus einer DLL
 
Zitat:

Zitat von Dunedain
Leider bekomme ich dann beim Versuch, das ganze zu kompilieren, zwei Fehlermeldungen
"Unresolved External TTest:: referenced from ..."
"Unresolved External __fastcall TTest::TTest( bool ) referenced from ..."

Wenn ich aber die .lib Datei in mein Projekt einbinde, das ganze also statisch linke, funzt alles...

Hat jemand ne Idee, wo mein Fehler liegen könnte?

Jede Methode, die aufgerufen wird, muss auch implementiert sein. Ausnahme: Sie ist als virtual deklariert. Du hast die Implementierung vllt. in der DLL liegen, aber das kann der Linker zur Compiletime nicht wissen. Die Implementierung liegt auch in der *.lib-Datei, welche gleich dazugelinkt wird, weshalb es dort zu keinem Fehler fuehrt. Hier gibts ein Beispiel, wie man Klassen aus DLLs laed.

greetz
Mike

Dunedain 18. Dez 2006 15:19

Re: [CPP] Dynamisches Laden einer Klasse aus einer DLL
 
Hallo,

erst mal danke für den weiterführenden Link. Nach einigen Code Anpassungen der Beispiele konnte ich die Demo erfolgreich zum laufen bringen.

Ist es also prinzipiell nicht möglich, eine Klasse aus einer dynamischen geladenen DLL zu exportieren, ohne das innerhalb der DLL eine Funktion erstellt werden muss die dann als Rückgabewert ein Objekt der geforderten Klasse liefert?

Und wie soll das mit dem "erforderlichen(?)" Interface bei 3rd Party DLLs, wie beispielsweise denen aus der C-Ecke aussehen?

Sorry, aber wie man unschwer erkennen kann, bin ich absoluter Neuling auf dem Gebiet "DLL".
Schonmal danke für die Hilfe :)

Olli 19. Dez 2006 02:48

Re: [CPP] Dynamisches Laden einer Klasse aus einer DLL
 
Man kann Daten, Klassen und Funktionen exportieren. Lies mal hier: http://assarbad.net/de/stuff/tutorials/dll_tutorial/ (ist zwar Delphi, vermittelt aber Grundlagen ;)).

In C/C++ gibt es noch verschiedene Dinge zu beachten wie Linkage. Angenommen du hast eine DLL in C geschrieben und kompiliert und willst die in einem C++-Projekt importieren, dann mußt du
Code:
extern "C"
vor die Funktion/Variable setzen oder den Header innerhalb eines Scopes:
Code:
extern "C"
{
// include <Header>
}
den C-Header (zur C-DLL) einbinden.


Alle Zeitangaben in WEZ +2. Es ist jetzt 11:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf