Punkty wejścia wyeksportowanej funkcji DLL
W przypadku wyeksportowanych funkcji biblioteki DLL użyj makra AFX_MANAGE_STATE , aby zachować odpowiedni stan globalny podczas przełączania z modułu DLL do biblioteki DLL wywołującej.
Po wywołaniu to makro ustawia pModuleState
wskaźnik na strukturę zawierającą AFX_MODULE_STATE
dane globalne dla modułu jako skuteczny stan modułu dla pozostałej części zawierającego zakres funkcji. Po opuszczeniu zakresu zawierającego makro zostanie automatycznie przywrócony poprzedni stan efektywnego modułu.
To przełączanie jest osiągane przez utworzenie wystąpienia AFX_MODULE_STATE
klasy na stosie. W konstruktorze ta klasa uzyskuje wskaźnik do bieżącego stanu modułu i przechowuje go w zmiennej składowej, a następnie ustawia pModuleState
jako nowy skuteczny stan modułu. W destruktorze ta klasa przywraca wskaźnik przechowywany w zmiennej składowej jako skuteczny stan modułu.
Jeśli masz wyeksportowaną funkcję, taką jak ta, która uruchamia okno dialogowe w bibliotece DLL, musisz dodać następujący kod na początku funkcji:
AFX_MANAGE_STATE(AfxGetStaticModuleState())
Spowoduje to zamianę bieżącego stanu modułu ze stanem zwróconym z elementu AfxGetStaticModuleState do końca bieżącego zakresu.
Jeśli makro nie zostanie użyte, wystąpią AFX_MANAGE_STATE
problemy z zasobami w bibliotekach DLL. Domyślnie MFC używa dojścia zasobów głównej aplikacji do załadowania szablonu zasobu. Ten szablon jest rzeczywiście przechowywany w dll. Główną przyczyną jest to, że informacje o stanie modułu AFX_MANAGE_STATE
MFC nie zostały przełączone przez makro. Dojście zasobów jest odzyskiwane ze stanu modułu MFC. Nie przełączaj stanu modułu powoduje użycie nieprawidłowego dojścia zasobu.
AFX_MANAGE_STATE
nie musi być umieszczana w każdej funkcji w bibliotece DLL. Na przykład InitInstance
może być wywoływany przez kod MFC w aplikacji bez AFX_MANAGE_STATE
, ponieważ MFC automatycznie przesuwa stan modułu przed InitInstance
, a następnie przełącza go z powrotem po InitInstance
powrocie. To samo dotyczy wszystkich programów obsługi mapy komunikatów. Zwykłe biblioteki DLL MFC mają specjalną procedurę okna głównego, która automatycznie przełącza stan modułu przed routingiem dowolnego komunikatu.