Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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