Zwykłe biblioteki DLL MFC połączone dynamicznie z MFC

Zwykła biblioteka MFC DLL dynamicznie połączona z MFC jest biblioteką DLL, która używa wewnętrznie MFC, a wyeksportowane funkcje w dll mogą być wywoływane przez pliki wykonywalne MFC lub inne niż MFC. Jak opisano w nazwie, ten rodzaj biblioteki DLL jest tworzony przy użyciu dynamicznej wersji biblioteki MFC (znanej również jako udostępniona wersja MFC). Funkcje są zwykle eksportowane ze standardowej biblioteki MFC DLL przy użyciu standardowego interfejsu języka C.

Należy dodać AFX_MANAGE_STATE makro na początku wszystkich wyeksportowanych funkcji w zwykłych bibliotekach DLL MFC, które dynamicznie łączą się z MFC, aby ustawić bieżący stan modułu na ten dla biblioteki DLL. Odbywa się to przez dodanie następującego wiersza kodu na początku funkcji wyeksportowanych z biblioteki DLL:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

Zwykła biblioteka MFC DLL, połączona dynamicznie z MFC, ma następujące funkcje:

  • Jest to nowy typ biblioteki DLL wprowadzony przez program Visual C++ 4.0.

  • Plik wykonywalny klienta można napisać w dowolnym języku, który obsługuje używanie bibliotek DLL (C, C++, Pascal, Visual Basic itd.); nie musi być aplikacją MFC.

  • W przeciwieństwie do statycznie połączonej standardowej biblioteki MFC DLL ten typ biblioteki DLL jest dynamicznie połączony z biblioteką MFC DLL (znaną również jako udostępniona biblioteka MFC DLL).

  • Biblioteka importowania MFC połączona z tym typem biblioteki DLL jest taka sama, jak w przypadku bibliotek DLL rozszerzeń MFC lub aplikacji korzystających z biblioteki MFC DLL: MFCxx(D).lib.

Zwykła biblioteka MFC DLL połączona dynamicznie z MFC ma następujące wymagania:

  • Te biblioteki DLL są kompilowane przy użyciu zdefiniowanych _AFXDLL , podobnie jak plik wykonywalny, który jest dynamicznie połączony z biblioteką DLL MFC. Ale _USRDLL jest również definiowana, podobnie jak zwykła biblioteka MFC DLL, która jest statycznie połączona z MFC.

  • Ten typ biblioteki DLL musi utworzyć wystąpienie klasy pochodnej CWinApp.

  • Ten typ biblioteki DLL używa elementu dostarczonego DllMain przez MFC. Umieść cały kod inicjowania specyficznego InitInstance dla biblioteki DLL w funkcji składowej i kod zakończenia, tak jak w ExitInstance normalnej aplikacji MFC.

Ponieważ tego rodzaju biblioteka DLL używa dynamicznej wersji biblioteki MFC, należy jawnie ustawić bieżący stan modułu na jedną dla biblioteki DLL. W tym celu użyj makra AFX_MANAGE_STATE na początku każdej funkcji wyeksportowanej z biblioteki DLL.

Zwykłe biblioteki DLL MFC muszą mieć klasę pochodną CWinAppi pojedynczy obiekt tej klasy aplikacji, podobnie jak aplikacja MFC. CWinApp Jednak obiekt biblioteki DLL nie ma głównej pompy komunikatów, podobnie jak CWinApp obiekt aplikacji.

Należy pamiętać, że CWinApp::Run mechanizm nie ma zastosowania do biblioteki DLL, ponieważ aplikacja jest właścicielem głównej pompy komunikatów. Jeśli biblioteka DLL wyświetli moderowe okna dialogowe lub ma własne okno głównej ramki, główna pompa komunikatów aplikacji musi wywołać procedurę wyeksportowaną przez bibliotekę DLL, która wywołuje CWinApp::PreTranslateMessagemetodę .

Umieść wszystkie inicjowanie specyficzne dla biblioteki DLL w funkcji składowej CWinApp::InitInstance , tak jak w normalnej aplikacji MFC. Funkcja CWinApp::ExitInstance składowa klasy pochodnej CWinApp jest wywoływana z udostępnionej DllMain funkcji MFC przed zwolnieniem biblioteki DLL.

Udostępnione biblioteki DLL MFCx0.dll i Msvcr*0.dll (lub podobne pliki) należy rozpowszechnić w aplikacji.

Biblioteka DLL, która jest dynamicznie połączona z MFC, nie może również statycznie łączyć się z MFC. Aplikacje łączą się ze zwykłymi bibliotekami DLL MFC dynamicznie połączonymi z MFC tak samo jak każda inna biblioteka DLL.

Symbole są zwykle eksportowane ze standardowej biblioteki MFC DLL przy użyciu standardowego interfejsu języka C. Deklaracja funkcji wyeksportowanej z regularnej biblioteki MFC DLL wygląda następująco:

extern "C" __declspec(dllexport) MyExportedFunction( );

Wszystkie alokacje pamięci w ramach regularnej biblioteki MFC DLL powinny pozostać w obrębie biblioteki DLL; biblioteka DLL nie powinna przekazywać ani odbierać z wywołującego pliku wykonywalnego dowolnego z następujących elementów:

  • wskaźniki do obiektów MFC

  • wskaźniki do pamięci przydzielonej przez MFC

Jeśli musisz wykonać dowolną z powyższych czynności lub jeśli musisz przekazać obiekty pochodne MFC między wywołującym plikiem wykonywalnym a biblioteką DLL, musisz skompilować bibliotekę DLL rozszerzenia MFC.

Można bezpiecznie przekazać wskaźniki do pamięci przydzielonej przez biblioteki czasu wykonywania języka C między aplikacją a biblioteką DLL tylko wtedy, gdy zostanie utworzona kopia danych. Nie można usuwać ani zmieniać rozmiaru tych wskaźników ani używać ich bez tworzenia kopii pamięci.

Podczas tworzenia regularnej biblioteki MFC DLL, która dynamicznie łączy się z MFC, należy użyć makra AFX_MANAGE_STATE , aby poprawnie przełączyć stan modułu MFC. Odbywa się to przez dodanie następującego wiersza kodu na początku funkcji wyeksportowanych z biblioteki DLL:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

Makro AFX_MANAGE_STATE nie powinno być używane w zwykłych bibliotekach MFC DLL, które statycznie łączą się z bibliotekami MFC lub w bibliotekach DLL rozszerzeń MFC. Aby uzyskać więcej informacji, zobacz Zarządzanie danymi stanu modułów MFC.

Aby zapoznać się z przykładem sposobu pisania, kompilowania i używania regularnej biblioteki MFC DLL, zobacz przykładową bibliotekę DLLScreenCap. Aby uzyskać więcej informacji na temat zwykłych bibliotek DLL MFC, które dynamicznie łączą się z MFC, zobacz sekcję zatytułowaną "Konwertowanie biblioteki DLLScreenCap na dynamiczne łączenie z biblioteką DLL MFC" w abstrakcie dla przykładu.

Co chcesz zrobić?

Co chcesz dowiedzieć się więcej?

Zobacz też

Rodzaje bibliotek DLL