Fehler beim starten der Dll



  • Hallo

    Ich habe ein test programm geschriebn und wollte ein 2tes Formular aus einer Dll holen und laden.

    Sitze jetzt schon drei Tage daran und komme nicht weiter , habe hier auch schon einige Postings gelesen haut aber leider bei mir alles nicht hin.

    Bekomme immer die Fehlermeldung "Externe Exception C000001D" kann aber damit leider nicht sehr viel anfangen.

    Würde mich über hilfe freuen.



  • Hallo,

    Wie wärs, wenn du uns mal zeigst wie du es machst (Quelltext).



  • 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