R
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