Tworzenie bibliotek DLL C/C++ w Visual Studio

W Windows biblioteka dynamic-link (DLL) to rodzaj pliku wykonywalnego, który działa jako udostępniona biblioteka funkcji i zasobów. Łączenie dynamiczne to funkcja systemu operacyjnego. Umożliwia plikowi wykonywalnemu wywołanie funkcji lub użycie zasobów przechowywanych w oddzielnym pliku. Te funkcje i zasoby można skompilować i wdrożyć niezależnie od plików wykonywalnych, które z nich korzystają.

Biblioteka DLL nie jest autonomicznym plikiem wykonywalnym. Biblioteki DLL są uruchamiane w kontekście aplikacji, które je wywołują. System operacyjny ładuje bibliotekę DLL do przestrzeni pamięci aplikacji. Odbywa się to po załadowaniu aplikacji (niejawne łączenie) lub na żądanie w czasie wykonywania (link jawny). Biblioteki DLL ułatwiają również udostępnianie funkcji i zasobów między plikami wykonywalnymi. Wiele aplikacji może jednocześnie uzyskać dostęp do zawartości pojedynczej kopii biblioteki DLL w pamięci.

Różnice między wiązań dynamicznych i statycznych

Statyczne łączenie kopiuje cały kod obiektu w bibliotece statycznej do plików wykonywalnych, które używają go podczas ich tworzenia. Łączenie dynamiczne obejmuje tylko informacje wymagane przez Windows w czasie działania w celu zlokalizowania i załadowania biblioteki DLL zawierającej element danych lub funkcję. Podczas tworzenia biblioteki DLL należy również utworzyć bibliotekę importu, która zawiera te informacje. Podczas tworzenia pliku wykonywalnego, który wywołuje bibliotekę DLL, linker używa wyeksportowanych symboli w bibliotece importu do przechowywania tych informacji dla Windows ładującego. Gdy modułu ładującego ładuje bibliotekę DLL, biblioteka DLL jest mapowana do obszaru pamięci aplikacji. Jeśli istnieje, specjalna funkcja w bibliotece DLL, DllMain, jest wywoływana w celu inicjowania wymaganego przez bibliotekę DLL.

Różnice między aplikacjami i bibliotekami DLL

Chociaż biblioteki DLL i aplikacje są modułami wykonywalnymi, różnią się one na kilka sposobów. Najbardziej oczywistą różnicą jest to, że nie można uruchomić biblioteki DLL. Z punktu widzenia systemu istnieją dwie podstawowe różnice między aplikacjami i bibliotekami DLL:

  • Aplikacja może mieć wiele wystąpień jednocześnie uruchomionych w systemie. Biblioteka DLL może mieć tylko jedno wystąpienie.

  • Aplikację można załadować jako proces. Może być właścicielem takich rzeczy jak stos, wątki wykonywania, pamięć globalna, dojścia do plików i kolejka komunikatów. Biblioteka DLL nie może być właścicielem tych rzeczy.

Zalety korzystania z bibliotek DLL

Dynamiczne łączenie z kodem i zasobami oferuje kilka zalet w łączeniu statycznym:

  • Łączenie dynamiczne pozwala zaoszczędzić pamięć i ograniczyć zamianę. Wiele procesów może jednocześnie używać biblioteki DLL, współużytkując pojedynczą kopię części biblioteki DLL tylko do odczytu w pamięci. Z kolei każda aplikacja, która jest budowaną przy użyciu statycznie połączonej biblioteki, ma pełną kopię kodu biblioteki, Windows załadować do pamięci.

  • Łączenie dynamiczne pozwala zaoszczędzić miejsce na dysku i przepustowość. Wiele aplikacji może współdzielić pojedynczą kopię biblioteki DLL na dysku. Z kolei każda aplikacja sbudowaną przy użyciu biblioteki linków statycznych ma kod biblioteki połączony z jej obrazem wykonywalnym. Zużywa to więcej miejsca na dysku i wymaga większej przepustowości do transferu.

  • Konserwacja, poprawki zabezpieczeń i uaktualnienia mogą być łatwiejsze. Gdy aplikacje używają typowych funkcji w bibliotece DLL, można zaimplementować poprawki błędów i wdrożyć aktualizacje biblioteki DLL. Gdy biblioteki DLL są aktualizowane, aplikacje, które z nich korzystają, nie muszą być ponownie kompilowane ani ponownie powiązane. Mogą oni korzystać z nowej biblioteki DLL natychmiast po jej wdrożeniu. Natomiast w przypadku poprawek w statycznie połączonym kodzie obiektu należy ponownie połączyć i ponownie włączyć każdą aplikację, która z niego korzysta.

  • Bibliotek DLL można użyć do zapewnienia obsługi po wymusieniu na rynku. Na przykład bibliotekę DLL sterownika wyświetlania można zmodyfikować w celu obsługi wyświetlania, który nie był dostępny podczas wysłania aplikacji.

  • Do odnajdywania i ładowania bibliotek DLL w czasie wykonywania można użyć jawnego łączenia. Na przykład rozszerzenia aplikacji, które dodają nowe funkcje do aplikacji bez ponownego kompilowania ani ponownego jej kompilowania.

  • Łączenie dynamiczne ułatwia obsługę aplikacji napisanych w różnych językach programowania. Programy napisane w różnych językach programowania mogą wywołać tę samą funkcję DLL, o ile programy są zgodne z konwencją wywoływania funkcji. Programy i funkcja DLL muszą być zgodne w następujący sposób: kolejność, w jakiej funkcja oczekuje wypchnięć argumentów do stosu. Czy funkcja, czy aplikacja jest odpowiedzialna za oczyszczanie stosu. Oraz to, czy jakieś argumenty są przekazywane w rejestrach.

  • Łączenie dynamiczne zapewnia mechanizm rozszerzania klas biblioteki klas Microsoft Foundation Class Library (MFC). Klasy można wyprowadzać z istniejących klas MFC i umieszczać je w bibliotece DLL rozszerzenia MFC do użytku przez aplikacje MFC.

  • Łączenie dynamiczne ułatwia tworzenie międzynarodowych wersji aplikacji. Biblioteki DLL to wygodny sposób dostarczania zasobów specyficznych dla regionalnych, co znacznie ułatwia tworzenie międzynarodowych wersji aplikacji. Zamiast wysyłać wiele zlokalizowanych wersji aplikacji, można umieścić ciągi i obrazy dla każdego języka w oddzielnej bibliotece DLL zasobów. Następnie aplikacja może załadować odpowiednie zasoby dla tych środowisk regionalnych w czasie wykonywania.

Potencjalną wadą korzystania z bibliotek DLL jest to, że aplikacja nie jest samodzielna. Zależy to od istnienia oddzielnego modułu biblioteki DLL: takiego, który należy wdrożyć lub zweryfikować samodzielnie w ramach instalacji.

Więcej informacji na temat tworzenia i używania bibliotek DLL

Poniższe artykuły zawierają szczegółowe informacje na temat tworzenia bibliotek DLL C/C++ w Visual Studio.

Przewodnik: Tworzenie i używanie biblioteki dołączanej dynamicznie (C++)
Zawiera opis sposobu tworzenia i używania biblioteki DLL przy użyciu Visual Studio.

Rodzaje bibliotek DLL
Dostarcza informacje dotyczące różnych rodzajów bibliotek DLL, które mogą być skompilowane.

Często zadawane pytania dotyczące bibliotek DLL
Dostarcza odpowiedzi na często zadawane pytania dotyczące bibliotek DLL.

Łączenie pliku wykonywalnego z biblioteką DLL
Opisuje jawne i niejawne łączenia z biblioteką DLL.

Inicjowanie biblioteki DLL
W tym artykule omówiono kod inicjowania bibliotek DLL, który musi zostać wykonany podczas ładowania biblioteki DLL.

Zachowanie biblioteki wykonawczej DLL i Visual C++
Opisuje sekwencję uruchamiania biblioteki uruchomieniowej DLL.

LoadLibrary i AfxLoadLibrary
W tym artykule omówiono używanie LoadLibrary i AfxLoadLibrary do jawnego łączenia z biblioteką DLL w czasie wykonywania.

GetProcAddress
W tym artykule omówiono GetProcAddress użycie funkcji w celu uzyskania adresu wyeksportowanego funkcji w bibliotece DLL.

FreeLibrary i AfxFreeLibrary
W tym artykule omówiono FreeLibrary używanie AfxFreeLibrary i kiedy moduł DLL nie jest już potrzebny.

Kolejność wyszukiwania bibliotek łączy dynamicznych
Opisuje ścieżkę wyszukiwania używaną Windows operacyjny do lokalizowania biblioteki DLL w systemie.

Stany modułu zwykłej biblioteki MFC DLL łączonej dynamicznie z MFC
Opisuje stany modułów zwykłej biblioteki MFC DLL dynamicznie połączonej z MFC.

Biblioteki DLL rozszerzeń MFC
Objaśnienie bibliotek DLL, które zwykle implementują klasy wielokrotnego użytku pochodzące z istniejących klas MFC.

Tworzenie biblioteki DLL z samymi zasobami
Omawia bibliotekę zasobów DLL, która zawierają tylko zasoby, takie jak ikony, mapy bitowe, ciągi i okna dialogowe.

Zlokalizowane zasoby w aplikacjach MFC: biblioteki DLL Satellite
Oferuje rozszerzoną obsługę satelitarnej biblioteki DLL; jest to funkcja, która pomaga w tworzeniu aplikacji zlokalizowanej w wielu językach.

Importowanie i eksportowanie
Zawiera opis importowania symboli publicznych do aplikacji lub eksportowania funkcji z biblioteki DLL

Technologia Active i biblioteki DLL
Umożliwia zaimplementowanie serwerów obiektów wewnątrz biblioteki DLL.

Automatyzacja w bibliotece DLL
Zawiera opis opcji automatyzacji w Kreatorze MFC DLL.

Konwencje nazewnictwa bibliotek DLL MFC
Omawia ustrukturyzowaną konwencję nazewnictwa bibliotek DLL i bibliotek zawartych w MFC.

Wywoływanie funkcji DLL z aplikacji języka Visual Basic
Opisuje, jak wywoływać funkcje biblioteki DLL z aplikacji Visual Basic.

Używanie MFC jako części biblioteki DLL
Opisuje zwykłe biblioteki DLL MFC, które umożliwiają używanie biblioteki MFC jako Windows biblioteki z linkami dynamicznymi.

Wersja biblioteki DLL MFC
Opisuje sposób korzystania z bibliotek udostępnionych MFCxx.dll i MFCxxD.dll (gdzie x jest numerem wersji MFC) z aplikacjami MFC i bibliotekami DLL rozszerzeń MFC.