Stany modułu zwykłej biblioteki MFC DLL łączonej dynamicznie z MFC
Możliwość dynamicznego łączenia regularnej biblioteki MFC DLL z biblioteką MFC DLL umożliwia korzystanie z niektórych konfiguracji, które są bardzo skomplikowane. Na przykład zwykła biblioteka MFC DLL i plik wykonywalny, który go używa, może dynamicznie łączyć się z biblioteką MFC DLL i dowolnymi bibliotekami DLL rozszerzeń MFC.
Ta konfiguracja stanowi problem w odniesieniu do danych globalnych MFC, takich jak wskaźnik do bieżącego CWinApp
obiektu i obsługa map.
Przed MFC w wersji 4.0 te dane globalne znajdują się w samej biblioteki MFC DLL i zostały udostępnione przez wszystkie moduły w procesie. Ponieważ każdy proces korzystający z biblioteki DLL Win32 pobiera własną kopię danych biblioteki DLL, ten schemat zapewnia łatwy sposób śledzenia danych poszczególnych procesów. Ponadto, ponieważ model AFXDLL zakłada, że w procesie będzie tylko jeden obiekt i tylko jeden CWinApp
zestaw map obsługi, te elementy można śledzić w samej biblioteki MFC DLL.
Jednak dzięki możliwości dynamicznego łączenia regularnej biblioteki MFC DLL z biblioteką MFC DLL można teraz mieć co najmniej dwa obiekty w procesie — a także dwa lub CWinApp
więcej zestawów map obsługi. Jak MFC śledzi, które z nich należy używać?
Rozwiązaniem jest nadanie każdemu modułowi (aplikacji lub regularnej biblioteki MFC DLL) własnej kopii tych informacji o stanie globalnym. W związku z tym wywołanie aplikacji AfxGetApp w regularnej biblioteki DLL MFC zwraca wskaźnik do CWinApp
obiektu w dll, a nie ten w pliku wykonywalnym. Ta kopia danych globalnych MFC jest znana jako stan modułu i jest opisana w notatce 58 MFC Tech Note 58.
Wspólna procedura okna MFC automatycznie przełącza się do prawidłowego stanu modułu, więc nie trzeba się martwić o to w żadnych programach obsługi komunikatów zaimplementowanych w regularnej biblioteki MFC DLL. Jednak gdy plik wykonywalny wywołuje zwykłą bibliotekę MFC DLL, musisz jawnie ustawić bieżący stan modułu na ten dla biblioteki DLL. W tym celu należy użyć makra AFX_MANAGE_STATE w każdej funkcji wyeksportowanej z biblioteki DLL. Odbywa się to przez dodanie następującego wiersza kodu na początku funkcji wyeksportowanych z biblioteki DLL:
AFX_MANAGE_STATE(AfxGetStaticModuleState( ))
Co chcesz dowiedzieć się więcej?
Zobacz też
Tworzenie bibliotek DLL języka C/C++ w programie Visual Studio