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?
-
Endlich hab ich den Artikel wiedergefunden:
http://www.cppbuilderdevjournal.com/articles/issues/9809/Using_a_VCL_form_in_a_DLL.htm
-
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