CMenu aus DLL?
-
Hallo!
Irgendwie scheint die Forum-Suchfunktion bei mir nicht zu gehen, daher dieses Posting...
Ich habe eine Frage bezüglich dem Menü für eine Dialoganwendung.okay.
Ich habe eine Dialoganwendung und habe die Stringtabel in eine DLL ausgelagert. Das Laden der DLL funktioniert und ich kann auch die Strings auslesen.
WENN eine DLL geladen wurde, wird die String ID aus der DLL gelesen, sonst halt lokal.Jetzt möchte ich es genau gleich mit dem Menü machen.
Wie habe ich es bis jetzt?
Per default wird beim Hinzufügen eines neuen Menüs IDR_MENU1 vorgeschlagen. Dieses habe ich auch bei der Dialoganwendung bereits hinzugefügt (Dlg Eigenschaften -> Menü -> ID auswählen). Das Menü wird somit beim Appstart ohne weiteren Code angezeigt.Nun möchte ich aber die IDR_MENU1 aus der DLL laden.
Das Problem: Ich erstelle das Menü ja eigentlich gar nicht selbst, sondern habe ich lediglich im Eigenschaftsfenster des Hauptdialogs ausgewählt. also muss ich das Menü halt irgndwie selber codemässig erstellen.Habe zu testzwecken eine Methode geschrieben, die zwar mit der lokalen IDR_MENU1 geht, doch wenn die DLL geladen ist und IDR_MENU1 aus der DLL geladen und angezeigt werden soll, geht nix!
void CResTestDlg::OnButton4(){ CMenu menu; if(!menu.LoadMenu(IDR_MENU1)){ AfxMessageBox("did not load menu"); } CWnd::SetMenu(&menu); menu.Detach(); }
Wenn ich die DLL geladen habe, erscheint die Msgbox - das lokale Menü geht allerdings!
Any help on this? Thanks so much!
Nachtrag:
in der MSDN habe ich noch folgenden Satz gelesen:LoadMenu(): Loads a menu resource from the application’s executable file and attaches it to the CMenu object.
Das verstehe ich so, dass ich die Methode 'LoadMenu()' nicht für das Laden eines Menüs aus einer DLL gebrauchen kann. Aber was muss ich dann tun?
-
Hm, schon mal MAKEINTRESOURCE(IDR_MENU1) versucht ?
Devil
-
devil81 schrieb:
Hm, schon mal MAKEINTRESOURCE(IDR_MENU1) versucht ?
Devil
Hilft leider auch nicht.
-
Ne, mit dieser Methode kann es glaube ich nicht klappen. Man kann ja nirgendwo das Modul-Handle (HINSTANCE) angeben. Zur Not LoadMenu aus der WinAPI benutzen und mit Attach an dein Objekt dranhängen.
HMENU menuHandle = ::LoadMenu(dllHandle, MAKEINTRESOURCE(IDR_MENU1)); CMenu menu; menu.Attach(menuHandle);
-
´´´´ schrieb:
Ne, mit dieser Methode kann es glaube ich nicht klappen. Man kann ja nirgendwo das Modul-Handle (HINSTANCE) angeben. Zur Not LoadMenu aus der WinAPI benutzen und mit Attach an dein Objekt dranhängen.
HMENU menuHandle = ::LoadMenu(dllHandle, MAKEINTRESOURCE(IDR_MENU1)); CMenu menu; menu.Attach(menuHandle);
Hi. das funktioniert leider auch nicht.
Nun gut, ein anderer Ansatz:
Ich erstellte lokal im Ressourceneditor zwei Menüs (IDR_MENU1, IDR_MENU2) mit deutschen und englischen Texten.
Will ich das eine Menü laden, geht es jetzt nicht mehr, weil ich zuvor mit folgendem Code die DLL geladen habe..m_dll_instance = LoadLibrary("Dll_en.dll"); // Dll laden ASSERT(m_dll_instance); // Ist Dll geladen? AfxSetResourceHandle(m_dll_instance); // Resourcenhandle auf Dll setzen
Aha.. Lädt man eine DLL, so hat man in dem Fall keinen Zugriff mehr auf lokale Ressourcen
DAS ist aber nicht das, was ich wollte. ICH wollte nur die Stringtables auslagern, eben halt das Sprachspezifische! So könnte ja die DLL (oder ich würde sie halt 'Language File' nennen) 'nur' das nötigste, d.h. Stringtables enthalten. JETZT müsste ich aber alle Ressourcen in die DLL packen. That sucks. PLus das will ich nicht
Wer weiss Rat?