Sdílet prostřednictvím


Stavy modulů běžné knihovny DLL dynamicky propojené ke knihovně MFC

Schopnost dynamicky propojit běžnou DLL knihovnu ke knihovně MFC DLL, umožňuje některé konfigurace, které jsou velmi složité. Například běžná DLL knihovna a spustitelný soubor, který používá dynamické propojení ke knihovně MFC DLL a k libovolným rozšiřujícím DLL knihovnám.

Tato konfigurace představuje problém s ohledem na globální údaje knihovny MFC, jako jsou například ukazatel na objekt CWinApp a zpracovávání map.

Před verzí 4.0 knihovny MFC, byly tyto globální data uloženy samostatně v knihovně DLL a knihovně MFC a byly sdíleny všemi moduly v procesu. Protože každý proces používá DLL knihovnu Win32, získá vlastní kopii dat knihovny DLL, toto schéma poskytuje jednoduchý způsob ke sledování dat podle procesů. Rovněž, protože model AFXDLL předpokládá, že bude pouze jeden objekt CWinApp a pouze jedna sada mapování v procesu, tyto položky mohou být sledovány samostatně v knihovně MFC DLL.

Ale umožňuje dynamicky propojit běžnou DLL knihovnu ke knihovně MFC je nyní možné mít dva nebo více objektů CWinApp v procesu – a také dvě nebo více sad mapování. Jak knihovna MFC udrží přehled o tom, která by měla být použita?

Řešení je poskytnout každému modulu (aplikaci nebo běžné DLL knihovně) svou vlastní kopii této informace globálního stavu. Proto volání AfxGetApp v běžné DLL knihovně vrátí ukazatel na objekt CWinApp v knihovně DLL, ne ten ve spustitelném souboru. Tato kopie modulu globálních dat knihovny MFC je nazývána jako stav modulu a je popsána v tématu Technická poznámka 58 knihovny MFC.

Společné okno procedury knihovny MFC se automaticky přepne na správný stav modulu, takže se o to nemusíte starat v jakýchkoliv popisovačích zpráv implementovaných ve Vaši běžné knihovně DLL. Ale když Váš spustitelný soubor volá do běžné DLL knihovny, musíte explicitně nastavit aktuální stav modulu na jeden pro knihovnu DLL. Chcete-li to provést, použijte makro AFX_MANAGE_STATE v každé exportované funkci z knihovny DLL. To je provedeno přidáním následující řádky kódu na začátek exportované funkce z knihovny DLL:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

Co chcete vědět více?

Viz také

Koncepty

Knihovny DLL