Fehler beim starten der Dll



  • Hier der Eintrag aus der Dll

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #include <windows.h>
    #include <FormDllunit.h>
    #pragma hdrstop
    
    //---------------------------------------------------------------------------
    #pragma argsused
    BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
    {
            return 1;
    }
    //---------------------------------------------------------------------------
    extern "C" __declspec (dllexport) void Dll_Form(TComponent* Owner)
     {
    
            TDllForm* DllForm = new TDllForm(Owner);
             DllForm->Height = 150;
             DllForm->Width = 150;
             DllForm->Show();
     }
     __declspec (dllexport) void Form_Destroy(TComponent* Owner)
     {
            delete DllForm;
     }
    

    Dll ging ohne Fehler zu compilieren habe dann Borland nochmal aufgemacht und eine TestForm1exe erzeugt Das Hauptprogramm:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "MainForm.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    
            TDll_Form* Dll_Form;
            HINSTANCE h = LoadLibrary("FormDll.dll");
            if(h != 0)
                      Dll_Form = (TDll_Form*)GetProcAddress(h,"_DllForm");
            else
                    ShowMessage("Kann 'FormDll.dll' nicht Laden !");
            if(Dll_Form != NULL)
                      Dll_Form(Owner);
            else
                     FreeLibrary(h);
    
    }
    //---------------------------------------------------------------------------
    

    Form.h

    //---------------------------------------------------------------------------
    
    #ifndef MainFormH
    #define MainFormH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
            TButton *Button1;
            TButton *Button2;
            void __fastcall Button1Click(TObject *Sender);
            void __fastcall Button2Click(TObject *Sender);
    private:	// Anwender-Deklarationen
    
             // die Form aus der Dll
             typedef void TDll_Form(TComponent* Owner);
    
    public:		// Anwender-Deklarationen
            __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    


  • extern "C" __declspec (dllexport) void Dll_Form(TComponent* Owner)
     {
    
            TDllForm* DllForm = new TDllForm(Owner);
             DllForm->Height = 150;
             DllForm->Width = 150;
             DllForm->Show();
     }
    
    Dll_Form = (TDll_Form*)GetProcAddress(h,"_DllForm");
    

    hmm... sollte das nicht viel eher heißen...[cpp] Dll_Form = (TDll_Form*)GetProcAddress(h,"Dll_Form");[/cpp]



  • @ Windoof

    hmmmm..... habe es jetzt mal so gemacht wie du geschriebne hast .

    Das gute ist der Fehler ist weg.

    Aber das schlechte ist es geht kein Fenster auf hmmm...

    😞



  • Dann ist das ein anderes Problem, liegt bestimmt an der Klasse in der DLL.



  • Der Unterstrich ist schon richtig.
    @Dll_Newbie
    Bist du mal mit dem Debugger durchgegangen? Wo tritt die Exception auf?
    Wenn deine dll nicht geladen werden kann (h==0) solltest du nicht nur eine Messagebox anzeigen, da du hier deine Funktion auf keinen Fall aufrufen kannst.



  • Die Exception tritt auf sobald er gekennzeichnet punkt betritt:

    TDll_Form* Dll_Form; 
            HINSTANCE h = LoadLibrary("FormDll.dll"); 
            if(h != 0) 
                      Dll_Form = (TDll_Form*)GetProcAddress(h,"_DllForm"); 
            else 
                    ShowMessage("Kann 'FormDll.dll' nicht Laden !"); 
            if(Dll_Form != NULL) 
                      Dll_Form(Owner); /* <-- Ab hier kommt Exception */
            else 
                     FreeLibrary(h);
    


  • Ist die dll richtig geladen (h!=0)?
    Ansonsten setze mal einen Breakpoint in die aufgerufene Funktion.
    Statt Owner solltest du normalerweise Application übergeben (sollte hier aber nicht das Problem sein).





  • Das ist ja interessant... wofür hast du denn zu danken fu?





  • Danke noch mal an alle für die Hilfe Habe es rausgefunden woran es lag:

    Fehler

    [cpp]
    TDll_Form* Dll_Form;
    HINSTANCE h = LoadLibrary("FormDll.dll");
    if(h != 0)
    Dll_Form = (TDll_Form*)GetProcAddress(h,"_DllForm");// <--Fehler lag hier in _DllForm
    else
    ShowMessage("Kann 'FormDll.dll' nicht Laden !");
    if(Dll_Form != NULL)
    Dll_Form(Owner); /* <-- Ab hier kommt Exception */
    else
    FreeLibrary(h);
    [/cpp]

    Hier der Behobene

    TDll_Form* Dll_Form; 
            HINSTANCE h = LoadLibrary("FormDll.dll"); 
            if(h != 0) 
     Dll_Form = (TDll_Form*)GetProcAddress(h,"_Dll_Form"); //<-- So geht es  :D 
            else 
                    ShowMessage("Kann 'FormDll.dll' nicht Laden !"); 
            if(Dll_Form != NULL) 
                      Dll_Form(Owner); /* <-- Ab hier kommt Exception */ 
            else 
                     FreeLibrary(h);
    


  • Also eine Kombinierung aus deinem und meinem 😃 auch nicht schlecht.



  • @ Windoof 2 Köpfe denken besser als einer 😃

    sehr gute Kombi


Anmelden zum Antworten