Tworzenie bibliotek DLL języka C/C++ w programie Visual Studio

W systemie Windows biblioteka łączy dynamicznych (DLL) jest rodzajem pliku wykonywalnego, który działa jako udostępniona biblioteka funkcji i zasobów. Łączenie dynamiczne to funkcja systemu operacyjnego. Umożliwia to plik wykonywalny wywoływania funkcji lub używania zasobów przechowywanych w osobnym pliku. Te funkcje i zasoby można kompilować i wdrażać oddzielnie od plików wykonywalnych, które ich używają.

Biblioteka DLL nie jest autonomicznym plikiem wykonywalnym. Biblioteki DLL są uruchamiane w kontekście aplikacji, które je nazywają. System operacyjny ładuje bibliotekę DLL do miejsca w pamięci aplikacji. Odbywa się to po załadowaniu aplikacji (niejawnym łączem) lub na żądanie w czasie wykonywania (jawne łączenie). Biblioteki DLL ułatwiają również udostępnianie funkcji i zasobów w plikach wykonywalnych. Wiele aplikacji może jednocześnie uzyskiwać dostęp do zawartości pojedynczej kopii biblioteki DLL w pamięci.

Różnice między łączeniem dynamicznym a łączeniem statycznym

Łączenie statyczne kopiuje cały kod obiektu w bibliotece statycznej do plików wykonywalnych, które używają go podczas ich kompilowania. Łączenie dynamiczne zawiera tylko informacje wymagane przez system Windows w czasie wykonywania 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 zawierającą te informacje. Podczas tworzenia pliku wykonywalnego, który wywołuje bibliotekę DLL, konsolidator używa wyeksportowanych symboli w bibliotece importu do przechowywania tych informacji dla modułu ładującego systemu Windows. Gdy moduł ładujący ładuje bibliotekę DLL, biblioteka DLL jest mapowana na przestrzeń pamięci aplikacji. W przypadku obecności funkcji specjalnej w bibliotece DLL , jest wywoływana w DllMaincelu wykonania dowolnej inicjalizacji wymaganej przez bibliotekę DLL.

Różnice między aplikacjami i bibliotekami DLL

Mimo że biblioteki DLL i aplikacje są oba moduły wykonywalne, różnią się 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ń działających jednocześnie 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 elementów jak stos, wątki wykonywania, pamięć globalna, dojścia plików i kolejka komunikatów. Biblioteka DLL nie może być właścicielem tych elementów.

Zalety korzystania z bibliotek DLL

Dynamiczne łączenie z kodem i zasobami oferuje kilka zalet związanych z łączeniem statycznym:

  • Łączenie dynamiczne oszczędza pamięć i zmniejsza zamianę. Wiele procesów może używać biblioteki DLL jednocześnie, współużytkując pojedynczą kopię części biblioteki DLL tylko do odczytu w pamięci. Z kolei każda aplikacja utworzona przy użyciu statycznie połączonej biblioteki ma pełną kopię kodu biblioteki, który system Windows musi załadować do pamięci.

  • Łączenie dynamiczne pozwala zaoszczędzić miejsce na dysku i przepustowość. Wiele aplikacji może współużytkować pojedynczą kopię biblioteki DLL na dysku. Z kolei każda aplikacja utworzona przy użyciu biblioteki linków statycznych ma kod biblioteki połączony z obrazem wykonywalnym. Wykorzystuje 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 dll, można zaimplementować poprawki błędów i wdrożyć aktualizacje w dll. Po zaktualizowaniu bibliotek DLL aplikacje korzystające z nich nie muszą być ponownie skompilowane ani ponownie powiązane. Mogą korzystać z nowej biblioteki DLL zaraz po jej wdrożeniu. Natomiast w przypadku wprowadzania poprawek w statycznie połączonym kodzie obiektu należy ponownie połączyć i ponownie wdrożyć każdą aplikację, która z niej korzysta.

  • Możesz użyć bibliotek DLL, aby zapewnić wsparcie po rynku. Na przykład bibliotekę DLL sterownika wyświetlania można zmodyfikować w celu obsługi wyświetlania, który nie był dostępny po wysłaniu aplikacji.

  • Możesz użyć jawnego łączenia w celu odnajdywania i ładowania bibliotek DLL w czasie wykonywania. Na przykład rozszerzenia aplikacji, które dodają nowe funkcje do aplikacji bez ponownego kompilowania lub ponownego wdrażania.

  • Łączenie dynamiczne ułatwia obsługę aplikacji napisanych w różnych językach programowania. Programy napisane w różnych językach programowania mogą wywoływać 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 której funkcja oczekuje, że jej argumenty zostaną wypchnięte na stos. Niezależnie od tego, czy funkcja, czy aplikacja jest odpowiedzialna za czyszczenie stosu. I czy jakiekolwiek argumenty są przekazywane w rejestrach.

  • Łączenie dynamiczne udostępnia mechanizm rozszerzania klas biblioteki klas programu Microsoft Foundation (MFC). Klasy można utworzyć z istniejących klas MFC i umieścić je w dll rozszerzenia MFC do użycia przez aplikacje MFC.

  • Łączenie dynamiczne ułatwia tworzenie międzynarodowych wersji aplikacji. Biblioteki DLL to wygodny sposób dostarczania zasobów specyficznych dla ustawień 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 biblioteki DLL zasobów. Następnie aplikacja może załadować odpowiednie zasoby dla tych ustawień 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 DLL: jeden, 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 języka C/C++ w programie Visual Studio.

Przewodnik: tworzenie i używanie biblioteki linków dynamicznych (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.

Biblioteka DLL — często zadawane pytania
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
Omówienie kodu inicjowania biblioteki DLL, który musi zostać wykonany podczas ładowania biblioteki DLL.

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

LoadLibrary i AfxLoadLibrary
Omówienie używania i LoadLibraryAfxLoadLibrary jawnego łączenia z biblioteką DLL w czasie wykonywania.

GetProcAddress
Omówienie używania GetProcAddress do uzyskiwania adresu wyeksportowanej funkcji w bibliotece DLL.

FreeLibrary i AfxFreeLibrary
Omówienie korzystania z modułu FreeLibrary DLL i AfxFreeLibrary gdy moduł DLL nie jest już potrzebny.

Kolejność wyszukiwania biblioteki dynamicznej
Opisuje ścieżkę wyszukiwania używaną przez system operacyjny Windows do lokalizowania biblioteki DLL w systemie.

Stany modułu regularnej biblioteki MFC DLL połączonej dynamicznie z MFC
Opisuje stany modułu regularnej biblioteki MFC DLL dynamicznie połączonej z MFC.

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

Tworzenie biblioteki DLL tylko dla zasobów
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 satelitarne
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

Aktywna technologia 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 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ą korzystanie z biblioteki MFC w ramach biblioteki linków dynamicznych systemu Windows.

Wersja biblioteki DLL MFC
Opisuje sposób używania bibliotek MFCxx.dll i MFCxxD.dll (gdzie x jest numerem wersji MFC) współużytkowanych bibliotek dynamicznych linków z aplikacjami MFC i bibliotekami DLL rozszerzeń MFC.