DLL dynamisch laden
-
Hallo,
ich bin in Sachen DLL blutiger Anfänger und habe aus dem "Builder-Tutorial" (http://www.c-plusplus.net/subs_guests/bcb-tutorial/inhalt.html) das Beispiel "dynamisches Einbinden einer DLL" erfolgreich nachvollzogen und kann es auch um Funktionsaufrufe erweitern. Nun möchte ich aus einer DLL ein VCL-Formular starten, mit Form->ShowModal(). Unter "Verwenden der VCL in DLLs" im "Builder-Tutorial" habe ich ein Beispiel dazu gefunden. Dieses Beispiel geht davon aus, das die DLL statisch geladen wird. Was muß ich ändern, wenn ich die DLL dynamisch laden will? Ich habe dazu das dynamische Beispiel aus dem "Builder-Tutorial" genommen und dann den Ansatz aus dem Beispiel "Verwenden der VCL in DLLs" verfolgt, also:
Datei/Neu.../Formular
Das Formular habe ich frmBackup genannt.
Abgespeichert wurde es als fBackup.cpp.Die Schnittstellenfunktion in der Unit 2 dazu lautet:
__declspec(dllexport) void FormShow(TComponent* Owner) { TfrmBackup *frmBackup = new TfrmBackup(Owner); frmBackup->ShowModal(); }
In DLLImp.h habe ich folgendes:
typedef int TFormShow(TComponent*); int FormShow(TComponent* Owner);
In DLLImp.cpp habe ich folgendes:
int FormShow(TComponent* Owner) { TFormShow *FormShow; int Erg; HINSTANCE h = LoadLibrary("Project2.dll"); if(h != 0) { FormShow = (TFormShow*)GetProcAddress(h, "_frmBackup"); } if(FormShow != NULL) { Erg = FormShow(Owner); //Fehlermeldung 'Externe Exeption C000001D' } else { Erg = 0; } FreeLibrary(h); return(Erg); }
In meinem Testprogramm:
void __fastcall TForm1::Button2Click(TObject *Sender) { FormShow(NULL); }
Folgende Fehlermeldung erscheint: ...Exeption der Klasse EExternalExeption aufgetreten. Meldung 'Externe Exeption C000001D'.
Was mache ich hier falsch?
-
Wenn LoadLibrary fehlschlägt bleibt FormShow undefiniert und es kann sonstwas passieren.
Außerdem solltest du eine Variable nicht genauso benennen wie eine Funktion.