DLL kann nicht entladen werden
-
Hallo,
ich benutze Visual Studio 2008 und möchte mit dynamisch geladenen DLLs arbeiten. Das verzögerte Laden klappt problemlos. Leider werde ich die DLLs dann nicht mehr los. Habe dazu schon die MSDN durchsucht und auch ausgiebig gegoogelt. Leider bin ich nicht fündig geworden.
Als erstes habe ich es mit "__FUnloadDelayLoadedDLL2()" versucht. Die Funktion wird korrekt ausgeführt, aber die DLL bleibt geladen.char ShowAboutBox(/*int layout*/){ char result = ' '; BOOL UnloadResult = FALSE;/**/ String ^msg = gcnew String("DLL konnte "); result = AboutBoxShow(/*layout*/); // Fkt ausfuehren... UnloadResult = __FUnloadDelayLoadedDLL2("AboutBox.dll"); if(!UnloadResult) msg += "nicht "; msg += "entladen werden!"; System::Windows::Forms::MessageBox::Show(msg, "Hello", System::Windows::Forms::MessageBoxButtons::OK); return result; }
In Variante 2 habe ich dann mit den "traditionellen" Methoden "LoadLibraryA()", "GetProcAddress()" und "FreeLibrary()" gearbeitet. Die DLL wird geladen, aber die Funktion nicht gefunden. Danach wird die DLL ordnungsgemäß wieder entladen. Suche ich nach der Funktion ohne vorangestellten Unterstrich, wird bei dieser Variante zwar die Funktion gefundn und ausgeführt, allerdings kann die DLL dann nicht entladen werden.
HMODULE LoadDLL(const char *name){ HMODULE hdll; hdll = LoadLibraryA(name); // DLL laden if(hdll != 0) return hdll; // konnte DLL geladen werden, Handle zurueckliefern else{ // sonst... int error = GetLastError(); // konnte DLL nicht geladen werden String ^msg = String::Format("Fehler: {0}!\t DLL: ", error); msg += gcnew String(name); msg += " konnte nicht geladen werden!"; MessageBox::Show(msg, gcnew String("DLL-Ladefehler"), MessageBoxButtons::OK, MessageBoxIcon::Warning); } return NULL; } //--------------------------------------------------------------------------- // Fktszeiger besorgen FARPROC GetFuncAddr(HMODULE hdll, LPCSTR name){ FARPROC addr; addr = GetProcAddress(hdll, name); // Adresse der Fkt holen if(addr == NULL){ // Fkt nicht gefunden? int error = GetLastError(); // konnte DLL nicht geladen werden String ^msg = String::Format("Fehler: {0}!\n Funktion: ", error); msg += gcnew String(name); msg += "() konnte in DLL nicht gefunden werden!"; MessageBox::Show(msg, gcnew String("DLL-Ladefehler"), MessageBoxButtons::OK, MessageBoxIcon::Warning); } return addr; // Adresse zurueckliefern } //--------------------------------------------------------------------------- ///////////////////////////////////////////////////////////////////////////////////////// // DLL laden BOOL UnLoadDLL(HMODULE hdll){ // DLL entladen BOOL result = FALSE; int error; if(hdll != NULL){ // DLL geladen... result = ::FreeLibrary(hdll); // DLL freigeben if(!result){ error = GetLastError(); // konnte DLL nicht entladen werden String ^msg = String::Format("Fehler: {0}!\n", error); msg += "DLL konnte nicht entladen werden!"; MessageBox::Show(msg, gcnew String("DLL-Entladefehler"), MessageBoxButtons::OK, MessageBoxIcon::Warning); } } else{ error = GetLastError(); // konnte DLL nicht geladen werden String ^msg = String::Format("Fehler: {0}!\n", error); msg += "DLL ist nicht geladen!"; MessageBox::Show(msg, gcnew String("DLL-Entladefehler"), MessageBoxButtons::OK, MessageBoxIcon::Warning); } return result; // Ergebnis zurueck } //--------------------------------------------------------------------------- // Funktionszeiger defininieren... typedef char (*TAboutBoxShow)(void); // Fktszeiger // Info-Dialog anzeigen char Show_About_Box(/*int layout*/){ char result = ' '; HMODULE hdll; TAboutBoxShow dlg; hdll = LoadDLL("AboutBox.dll"); // DLL laden if(hdll != NULL){ // konnte DLL geladen werden... dlg = (TAboutBoxShow)GetFuncAddr(hdll, "_AboutBoxShow"); if(dlg != NULL){ // konnte Funktion gefunden werden... result = dlg(); // Funktion ausfuehren } UnLoadDLL(hdll); // DLL entladen } return result; } //---------------------------------------------------------------------------
Bei beiden Varianten sind beide Projekte als /clr erzeugt. Die DLL wurde mit Entladen unterstützen (/DELAY:UNLOAD) erzeugt.
Wie kann ich die Funktion ausführen und die DLL anschließend entladen?
Vielen Dank schon mal im Voraus
Gruß RastowMax