Udostępnij za pośrednictwem


Biblioteki DLL rozszerzenia

Rozszerzenie MFC DLL jest biblioteki DLL, która zazwyczaj wykonuje klas wielokrotnego użytku, pochodzące z istniejących klas Microsoft Foundation klasy biblioteki.

Biblioteka DLL rozszerzenia MFC ma następujące funkcje i wymagania:

  • Klient wykonywalny musi być skompilowana z aplikacji MFC _AFXDLL zdefiniowane.

  • Biblioteka DLL rozszerzenia można również przez regularne biblioteki DLL, która dynamicznie połączone z MFC.

  • Biblioteki DLL rozszerzenia należy sporządzić z _AFXEXT zdefiniowane.Zmusza to _AFXDLL należy również określić i zapewnia właściwe deklaracje jest ściągnięta z plikami nagłówka MFC.Ponadto zapewnia, że AFX_EXT_CLASS jest zdefiniowana jako opcję __declspec(dllexport) podczas budowania biblioteki DLL, która jest niezbędna, jeśli używasz tego makra zadeklarować klasy w swoje biblioteki DLL rozszerzenia.

  • Biblioteki DLL rozszerzenia nie powinny utworzyć wystąpienia klasy pochodzącej od CWinApp, ale powinny polegać na aplikacji klienta (lub DLL) zapewnienie tego obiektu.

  • Biblioteki DLL rozszerzenia powinny zapewnia jednak DllMain funkcję i wykonaj wszelkie niezbędne inicjalizacji.

Biblioteki DLL rozszerzenia są zbudowane przy użyciu wersji biblioteki MFC (znany również jako wersję udostępnionego MFC).Tylko MFC wykonywalne (aplikacji lub regularnych dll) wbudowanych z udostępnioną wersję MFC można użyć rozszerzeniem DLL.Zarówno aplikacji klienta, jak i Biblioteka DLL rozszerzenia należy użyć tej samej wersji MFCx0.dll.Z rozszerzeniem DLL może dziedziczyć nowe, niestandardowe klasy MFC i następnie oferują to rozszerzona wersja MFC do aplikacji, które wywołują bibliotekę DLL.

Można również biblioteki DLL rozszerzenia dla przekazując uzyskane MFC obiektów między aplikacją i biblioteki DLL.Funkcje składowe skojarzone z obiektem przekazany istnieje w module, w którym obiekt został utworzony.Ponieważ te funkcje są prawidłowo wyeksportowane podczas korzystania z udostępnionych wersji biblioteki DLL MFC, można swobodnie przekazywać MFC lub wskaźników uzyskanych MFC obiektu między aplikacją i ładuje biblioteki DLL rozszerzenia.

Biblioteka DLL rozszerzenia MFC używa wersji udostępnionego MFC tak samo, jak aplikacja używa udostępnioną wersję DLL MFC, z kilku uwagi dodatkowe:

  • Nie ma CWinApp-uzyskane obiektu.Muszą pracować z CWinApp-uzyskane obiektu aplikacji klienta.Oznacza to, że aplikacja klienta jest właścicielem pompy główne wiadomości, pętlę bezczynności i tak dalej.

  • Wywołuje AfxInitExtensionModule w jego DllMain funkcji.Należy sprawdzić wartość zwracaną przez tę funkcję.Jeśli zwracana jest wartość zero z AfxInitExtensionModule, zwraca 0 z programu DllMain funkcji.

  • Tworzy on CDynLinkLibrary obiektu podczas inicjowania, jeśli rozszerzenie DLL chce eksportować CRuntimeClass obiektów lub zasobów do aplikacji.

Przed wersji 4.0 MFC DLL tego typu została wywołana AFXDLL.AFXDLL odnosi się do _AFXDLL preprocesora symbol, który jest zdefiniowany, Konstruując biblioteki DLL.

Bibliotek importu dla wersji udostępnionego MFC są nazywane zgodnie z Konwencją, opisane w Naming conventions dla biblioteki MFC DLL.Visual C++ dostarcza wbudowane wersji biblioteki MFC DLL oraz numer z non - MFC DLL można używać i rozpowszechniać z aplikacjami.Te są udokumentowane w Redist.txt, który jest instalowany w folderze Program Files\Microsoft Visual Studio.

Jeśli eksportujesz przy użyciu pliku .def na początku i na końcu pliku nagłówka należy umieścić następujący kod:

#undef AFX_DATA
#define AFX_DATA AFX_EXT_DATA
// <body of your header file>
#undef AFX_DATA
#define AFX_DATA

Te cztery linie zapewnienia prawidłowo skompilowany kod, z rozszerzeniem DLL.Pomijając te cztery linie może spowodować biblioteki DLL do kompilowania albo nieprawidłowe łącze.

Jeżeli trzeba przekazać MFC lub wskaźnik do obiektu MFC pochodzących z MFC DLL, biblioteka DLL lub powinny być rozszerzenie DLL.Funkcje składowe skojarzone z obiektem przekazany istnieje w module, w którym obiekt został utworzony.Ponieważ te funkcje są prawidłowo wyeksportowane podczas korzystania z udostępnionych wersji biblioteki DLL MFC, można swobodnie przekazywać MFC lub wskaźników uzyskanych MFC obiektu między aplikacją i ładuje biblioteki DLL rozszerzenia.

Ze względu na C++ Nazwa przekręcona i wywóz problemy listy eksportowanych z rozszerzeniem DLL może być różne dla różnych platform dla bibliotek DLL i debugowania i detaliczne wersje tej samej bibliotece DLL.Detalicznych MFCx0.dll około 2 000 wywiezionego punkty wejścia; Program debug MFCx0D.dll ma około 3000 punkty wejścia wywożonych.

Zarządzanie pamięcią

MFCx0.dll i wszystkie biblioteki DLL rozszerzenia ładowane do wykorzystania miejsca na adres aplikacja klienta ten sam program przydzielania pamięci, obciążenia zasobów i inne Państwa globalnego MFC tak, jakby były w tej samej aplikacji.Jest to istotne, ponieważ biblioteki DLL nie MFC i regularne biblioteki DLL czy dokładnym przeciwieństwem i mają każdej biblioteki DLL przydzielania z własnej puli pamięci.

Jeśli biblioteka DLL rozszerzenia przydziela pamięć, że pamięć można swobodnie intermix z innym obiektem przydzielone aplikacji.Również aplikacji, która dynamicznie łączy MFC nie powiedzie się, ochrona systemu operacyjnego zachowuje integralność innych aplikacji MFC, udostępnianie biblioteki DLL.

Podobnie inne globalne MFC, bieżącego pliku wykonywalnego do ładowania zasobów, takich jak są również wspólnie przez aplikację klienta i wszystkie biblioteki DLL rozszerzenia MFC także MFCx0.dll sobie.

Udostępnianie zasobów i klasy

Eksportowanie zasobów odbywa się poprzez listę zasobów.Każdy wniosek zawiera listę połączonych pojedynczo CDynLinkLibrary obiektów.Podczas wyszukiwania zasobów, większość standardowych implementacje MFC, które ładują zasoby przyjrzeć bieżącego modułu zasobów (AfxGetResourceHandle) i jeśli nie znaleziono zasobu walk listy CDynLinkLibrary obiektów próby załadowania żądanego zasobu.

Idzie na liście ma wady, że jest nieco wolniejsze i wymaga zarządzania zakresami identyfikator zasobu.Posiada zaletą aplikacji klienckiej, która łączy kilka bibliotek DLL rozszerzenia można użyć dowolnego dostarczonych do biblioteki DLL zasobów bez konieczności określania uchwyt instancji DLL.AfxFindResourceHandleInterfejs API służy do chodzenia listy zasobów do wyszukiwania dla danego dopasowania.To nazwa i typ zasobu i zwraca uchwyt zasobów, którym najpierw ustalono (lub NULL).

Jeśli nie chcesz walk listy i załadować tylko zasoby z określonego miejsca, użyj funkcji AfxGetResourceHandle i AfxSetResourceHandle zapisać stary uchwyt i ustawić nowy uchwyt.Pamiętaj przywrócić stary dojścia do zasobu przed zwróceniem się do aplikacji klienta.Przykładem jawnie załadować menu za pomocą tego podejścia, zobacz .cpp Testdll2 w próbce MFC DLLHUSK.

Dynamiczne tworzenie obiektów MFC imię MFC jest podobny.Mechanizm deserializacji obiektu MFC musi mieć wszystkie CRuntimeClass obiekty zarejestrowane tak, aby go odtworzyć, tworząc dynamicznie C++ obiektów typu wymagane na podstawie co został wcześniej przechowywane.

W przypadku próbki MFC DLLHUSK, listy wyglądać:

head ->   DLLHUSK.EXE   - or -   DLLHUSK.EXE
               |                      |
          TESTDLL2.DLL           TESTDLL2.DLL
               |                      |
          TESTDLL1.DLL           TESTDLL1.DLL
               |                      |
           MFCOxxD.DLL                |
               |                      |
           MFCDxxD.DLL                |
               |                      |
            MFCxxD.DLL            MFCxx.DLL

gdy xx jest numerem wersji; na przykład 42 reprezentuje wersji 4.2.

MFCxx.dll jest zazwyczaj ostatni na liście klasy i zasobów.MFCxx.dll zawiera wszystkie standardowe zasoby MFC, w tym prompt ciągi dla wszystkich identyfikatorów standardowego polecenia.Umieszczając go na końcu listy umożliwia bibliotek DLL i sama aplikacja klienta nie ma własną kopię zasobów MFC standardowych, ale zamiast opierać się na zasobach udostępnionych w MFCxx.dll.

Scalanie zasobów i klasy nazwy wszystkich plików DLL do przestrzeni nazw aplikacji klienta ma na niekorzyść wymagające należy zachować ostrożność, z jakiego identyfikatory lub nazwy, możesz wybrać.

DLLHUSK próbki zarządza obszar nazw zasobu udostępnionego przy użyciu wielu plików nagłówkowych.

Jeśli biblioteka DLL rozszerzenia MFC musi utrzymać dodatkowe dane dla każdej aplikacji, można czerpać z nową klasę CDynLinkLibrary i utworzyć go w DllMain.Podczas uruchamiania, biblioteka DLL można sprawdzić listę bieżącej aplikacji CDynLinkLibrary obiektów, aby znaleźć jeden dla tej określonej biblioteki DLL rozszerzenia.

h5f7ck28.collapse_all(pl-pl,VS.110).gifCo chcesz zrobić?

h5f7ck28.collapse_all(pl-pl,VS.110).gifCo chcesz wiedzieć więcej?

Zobacz też

Koncepcje

Biblioteki DLL w programie Visual C++