Vstupní body exportované funkce DLL
Pro exportované funkce knihovny DLL použijte makro AFX_MANAGE_STATE k zachování správného globálního stavu při přechodu z modulu DLL na knihovnu DLL volající aplikace.
Při zavolání se toto makro nastaví pModuleState
, ukazatel na AFX_MODULE_STATE
strukturu obsahující globální data pro modul, jako efektivní stav modulu pro zbytek rozsahu funkce. Po opuštění oboru obsahujícího makro se předchozí stav efektivního modulu automaticky obnoví.
Toto přepínání se dosahuje vytvořením instance AFX_MODULE_STATE
třídy v zásobníku. V jeho konstruktoru získá tato třída ukazatel na aktuální stav modulu a uloží ho do členské proměnné a pak nastaví pModuleState
jako nový efektivní stav modulu. V jeho destruktoru tato třída obnoví ukazatel uložený ve své členské proměnné jako efektivní stav modulu.
Pokud máte exportovanou funkci, například funkci, která spustí dialogové okno v knihovně DLL, musíte na začátek funkce přidat následující kód:
AFX_MANAGE_STATE(AfxGetStaticModuleState())
Tím se aktuální stav modulu prohodí se stavem vráceným z AfxGetStaticModuleState do konce aktuálního oboru.
Pokud se makro nepoužívá, dojde k AFX_MANAGE_STATE
problémům s prostředky v knihovnách DLL. Mfc ve výchozím nastavení používá k načtení šablony prostředku popisovač hlavní aplikace. Tato šablona je ve skutečnosti uložena v knihovně DLL. Hlavní příčinou je, že makro nepřepnulo AFX_MANAGE_STATE
informace o stavu modulu MFC. Popisovač prostředku se obnoví ze stavu modulu MFC. Přepnutí stavu modulu způsobí použití nesprávného popisovače prostředků.
AFX_MANAGE_STATE
není nutné zadávat do každé funkce v knihovně DLL. Kód MFC v aplikaci lze například volat bez toho, InitInstance
protože MFC automaticky posune stav modulu před InitInstance
a potom ho přepne zpět po InitInstance
AFX_MANAGE_STATE
vrácení. Totéž platí pro všechny obslužné rutiny mapování zpráv. Běžné knihovny MFC DLL mají ve skutečnosti speciální hlavní okno procedura, která automaticky přepne stav modulu před směrováním jakékoli zprávy.