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