AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein [CPP] Dynamisches Laden einer Klasse aus einer DLL

[CPP] Dynamisches Laden einer Klasse aus einer DLL

Ein Thema von Dunedain · begonnen am 17. Dez 2006 · letzter Beitrag vom 19. Dez 2006
Antwort Antwort
Dunedain
(Gast)

n/a Beiträge
 
#1

[CPP] Dynamisches Laden einer Klasse aus einer DLL

  Alt 17. Dez 2006, 20:18
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?
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#2

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

  Alt 17. Dez 2006, 20:46
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
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
Dunedain
(Gast)

n/a Beiträge
 
#3

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

  Alt 18. Dez 2006, 14:19
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
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#4

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

  Alt 19. Dez 2006, 01:48
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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz