Stavy modulů běžné knihovny MFC DLL dynamicky propojené do MFC
Schopnost dynamicky propojit běžnou knihovnu MFC DLL s knihovnou MFC DLL umožňuje některé konfigurace, které jsou velmi složité. Například běžná knihovna MFC DLL a spustitelný soubor, který ho používá, mohou dynamicky propojit knihovnu MFC DLL i se všemi rozšiřujícími knihovnami DLL MFC.
Tato konfigurace představuje problém s ohledem na globální data MFC, například ukazatel na aktuální CWinApp
objekt a popisovač map.
Před mfc verze 4.0 se tato globální data nacházela v samotné knihovně MFC DLL a byla sdílena všemi moduly v procesu. Vzhledem k tomu, že každý proces používající knihovnu DLL win32 získá vlastní kopii dat knihovny DLL, toto schéma poskytuje snadný způsob sledování dat pro jednotlivé procesy. Vzhledem k tomu, že model AFXDLL předpokládá, že v procesu by byl pouze jeden CWinApp
objekt a pouze jedna sada map popisovačů, lze tyto položky sledovat v samotné knihovně MFC DLL.
S možností dynamicky propojit běžnou knihovnu MFC DLL s knihovnou MFC DLL je nyní možné mít v procesu dva nebo více CWinApp
objektů – a také dvě nebo více sad map úchytů. Jak mfc sleduje, které z nich má používat?
Řešením je poskytnout každému modulu (aplikaci nebo běžné knihovně MFC DLL) vlastní kopii těchto globálních informací o stavu. Proto volání AfxGetApp v běžné knihovně MFC DLL vrátí ukazatel na CWinApp
objekt v knihovně DLL, nikoli na objekt ve spustitelném souboru. Tato kopie globálních dat MFC pro jednotlivé moduly se označuje jako stav modulu a je popsána v dokumentaci MFC Tech Note 58.
Běžná procedura MFC automaticky přepne do správného stavu modulu, takže se o něj nemusíte starat v žádných obslužných rutinách zpráv implementovaných v běžné knihovně MFC DLL. Ale když spustitelný soubor volá do běžné knihovny MFC DLL, musíte explicitně nastavit aktuální stav modulu na ten, který je pro knihovnu DLL. K tomu použijte makro AFX_MANAGE_STATE ve všech funkcích exportovaných z knihovny DLL. To se provádí přidáním následujícího řádku kódu na začátek funkcí exportovaných z knihovny DLL:
AFX_MANAGE_STATE(AfxGetStaticModuleState( ))