Announcement

Collapse
No announcement yet.

Klasse aus einer DLL importiern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Klasse aus einer DLL importiern

    Moin, moin!

    Ich versuche eine Klasse aus einer DLL in eine EXE zu importieren. Dazu habe ich die Anleitung von Christian gelesen.

    A. DLL

    Die von ihm vorgeschlagene Deklaration in der Form:

    Code:
    //---------------------------------------------------------------------------
    #ifndef unImExFormH
    #define unImExFormH
    //---------------------------------------------------------------------------
    #ifdef __DLL__
    # define DLL_IMP_EXP __declspec(dllexport)
    #else
    # define DLL_IMP_EXP __declspec(dllimport)
    #endif
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class DLL_IMP_EXP TImExForm : public TForm
    ...
    kann ich nicht kompilieren. Schon die IDE meckert, dass die Deklaration der Klasse nicht existiert bzw. falsch ist und startet den Kompiler nicht. Nachdem ich die Wörter "class" und "DLL_IMP_EXP" vertauscht habe, war scheinbar alles ok. Das ist der vollstaendige Text meiner DLL.H-Datei, die sich kompilieren lässt:

    Code:
    //---------------------------------------------------------------------------
    #ifndef unImExFormH
    #define unImExFormH
    //---------------------------------------------------------------------------
    #ifdef __DLL__
    # define DLL_IMP_EXP __declspec(dllexport)
    #else
    # define DLL_IMP_EXP __declspec(dllimport)
    #endif
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    DLL_IMP_EXP class TImExForm : public TForm
    {
    __published:	// IDE-managed Components
        TLabel *Label1;
    private:	// User declarations
    public:		// User declarations
        __fastcall TImExForm(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TImExForm *ImExForm;
    //---------------------------------------------------------------------------
    #endif

    B. EXE
    Nachdem ein Button auf der EXE-Form geklickt wird möchte ich die Form aus der DLL anzeigen lassen:

    Code:
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        TImExForm *DllForm = new TImExForm(Application);
    
        DllForm->Show();
    }
    Leider kann ich das EXE-Projekt nicht erstellen. Der Kompiler meckert nicht, stattdessen hat der Linker ein Problem (siehe Anhang).

    In das EXE-Projekt habe ich die DLL-H-Datei included, und Include- und Library-Verzeichnisse um den Eintrag des DLL-Projektes erweitert.

    Who can help?

    Viele Grüße
    Markus
    Attached Files

  • #2
    Include- und Library-Verzeichnisse um den Eintrag des DLL-Projektes
    Wo ist die Lib und wird diese eingebunden?
    Christian

    Comment


    • #3
      Hallo Christian!

      Die DLL.lib-Datei befindet sich in dem DLL-Projekt-Verzeichnis. Das DLL-Projekt-Vezeichnis habe ich wiederum in den EXE-Projekt-Einstellungen (Projekt->Options->Directories/Conditionals in "Include path" und "Library path") zugefügt. Dadurch sollte der Linker beim Linken der EXE die DLL.lib-Datei finden und einblinden.

      Oder mache ich etwas gründsätzlich falsch?

      Viele Grüße
      Markus

      Comment


      • #4
        In den include Pfad gehört die Header; in den Lib Pfad die Library Datei. Nicht das ganze Projekt in Beide. Jedenfalls halte ich es so...Des Weiteren füge den Includewächter mal nach den Import, Export ein
        Christian

        Comment


        • #5
          Hallo Chistian!

          Danke für deine Hinweise.

          Im DLL-Projekt-Verzeichnis befinden sich beide Dateien (DLL.h und DLL.lib). Deswegen habe ich das Verzeichnis sowohl im "Include pfad" als auch im "Library pfad" definiert. Leider hat mich das nicht weiter gebracht. Dann muss ich wohl weiter forschen ...

          Eine frage hätte ich noch:

          Warum wird so eine Deklaration...

          Code:
          class DLL_IMP_EXP TImExForm : public TForm
          ...von der IDE bemeckert (siehe Anhang) und so eine...

          Code:
          DLL_IMP_EXP class TImExForm : public TForm
          ...nicht?

          Viele Grüße
          Markus
          Attached Files

          Comment


          • #6
            Keine Ahnung, bei mir läuft es so und so...

            Welche C++Builder Version? Ev. ein neuer Standard..
            Christian

            Comment


            • #7
              Hallo Christian!

              Ich spiele mit BC++5.

              Viele Grüße
              Markus

              Comment


              • #8
                hmm hier die 2006er
                Christian

                Comment


                • #9
                  Salve,

                  hatte ich glaube schon mal gepostet.
                  So funzt es immer egal welche CB version.

                  Header für DLL erzeugen ist eine extra h datei
                  somit entfällt define

                  extern "C"
                  {
                  ..Deine funktionen
                  __declspec( dllexport ) bool mybool();
                  }

                  #endif

                  header für include in anderes projekt
                  extern "C"
                  {
                  extern bool mybool();
                  }

                  #endif

                  In der cpp der DLL erzeugung ganz normale deklaration.

                  cpp für Dll export( auch extra )

                  #include <vcl.h>
                  #pragma hdrstop

                  ... alle weiteren header
                  bool mybool()
                  {
                  bool ret = false;
                  // Dein Code für die Lib hier ohne sicherheit
                  z.B
                  if( !myclass)
                  myclass = new MyClass();

                  if( myclass )
                  myclass->Show();
                  ....
                  return ret;
                  }

                  cpp externes projekt
                  include header + lib

                  Zugriff
                  HINSTANCE mlib=LoadLibrary("My.DLL");
                  if( mlib )
                  mybool();
                  else
                  ....

                  So funktioniert es für MFC/Borland etc.
                  Nur die lib muß für jede umgebung erzeugt werden.


                  mfg
                  Fred

                  Comment

                  Working...
                  X