[DLL] "Cannot find window class."



  • moin

    ich rufe über ein programm eine funktion in meiner DLL auf (load_window), die wiederrum ein eigenständiges fenster lädt:

    DLLEXPORT int load_window(HINSTANCE hInstance)
    {
    
    	// Common Controls initialisieren... .
    	INITCOMMONCONTROLSEX iccex;
    	iccex.dwSize = sizeof(iccex);
    	iccex.dwICC = ICC_DATE_CLASSES;
    	InitCommonControlsEx(&iccex);
    
    	// Los geht's mit IDD_MAIN... .
    	DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, MainDlgProc, (LPARAM)hInstance);
    
    	return(0);
    }
    

    die dll wird mit loadlibrary geladen und sofort wieder freigegeben - das fenster bleibt geöffnet doch wenn ich es schließe kann ich es nicht wieder mit der selben methode öffnen. fehlercode ist 1407 "Cannot find window class.". ich lade bereits andere fenster auf die selbe weise - da geht's. hängt es mit dem Datumselement zusammen? allerdings benutze ich in anderen fenster auch spezielle commoncontrols wie listen und tabs.

    kann es sein, dass ich iccex erst wieder entladen muss oder so?

    so long

    eagle2k

    edit: mir ist gerade aufgefallen, dass, wenn ich das datumselement entferne, das problem nicht auftritt



  • eagle2k schrieb:

    die dll wird mit loadlibrary geladen und sofort wieder freigegeben

    Von welcher Dll sprichst Du? Warum wirfst Du die Dll gleich wieder raus, wenn der Code der zum Fenster gehörigen WndProc in der Dll sitzt? Auf welchem System hast Du das Ganze überhaupt getestet?

    Zum Thema ein Zitat aus der Hilfe zu RegisterClassEx:

    MSDN schrieb:

    Windows 95/98/Me: All window classes registered by a dynamic-link library (DLL) are unregistered when the .dll is unloaded.



  • also, programmieren tue ich mit vs .net
    ich bin dabei ein programm mit plugins zu schreiben. diese dll von der ich rede ist eins dieser plugins, das zur laufzeit geladen werden soll.

    und die dll entlade ich direkt wieder, weil ich keine ahnung habe, wie es eleganter geht.. 🙂

    zZ macht mir scheinbar ein Datumselement (DateTimePicker oder so ähnl) probleme, denn wenn ich dieses aus meinem formular entferne funktionierts und ich kann das fenster beliebig oft schließen und neuladen.

    laden tue ich die dll so:

    typedef int (* DLLLOADWINDOW)(HINSTANCE hInstance);
    DLLLOADWINDOW DLLAV = NULL;
    HMODULE hAV = LoadLibrary("av.dll");
    if (hAV == NULL) { 
     MessageBox(hwnd, "Die DLL 'av.dll' wurde nicht gefunden!\nBitte installieren Sie das Programm neu!", "Fehler", MB_ICONHAND);
     break;
    }
    
    DLLAV = (DLLLOADWINDOW)GetProcAddress(hAV, "load_window"); 
    if (DLLAV == NULL) { 
     MessageBox(hwnd, "Die DLL 'av.dll' ist fehlerhaft!\nBitte installieren Sie das Programm neu!", "Fehler", MB_ICONHAND);
     break;
    }
    
    DLLAV((HINSTANCE)hAV);
    
    FreeLibrary(hAV);
    

    gibt es da bessere möglichkeiten auch in betracht, dass ich mit meiner jetzigen methode ein fenster 150x laden kann? 🤡

    ohje... . 😉

    eagle2k



  • -King- schrieb:

    Warum wirfst Du die Dll gleich wieder raus, wenn der Code der zum Fenster gehörigen WndProc in der Dll sitzt?

    Die Frage bleibt bestehen.



  • eagle2k schrieb:

    und die dll entlade ich direkt wieder, weil ich keine ahnung habe, wie es eleganter geht..

    darum. kann ich denn irgendwie erfahren, ob mein dll-fenster geschlossen wird, sodass ich die dll entlade, nachdem meine dll nicht mehr benötigt wird?



  • Wenn du das Handle hast kannst du doch überprüfen, ob das noch stimmt - oder du benachrichtigst dein Hauptfenster 😉


Anmelden zum Antworten