Ustalanie, jakiej metody łączenia użyć

Istnieją dwa typy łączenia: łączenie niejawne i jawne łączenie.

Łączenie niejawne

Łączenie niejawna występuje, gdy kod aplikacji wywołuje funkcję wyeksportowaną biblioteki DLL.Jeśli wywołujący plik wykonywalny kod źródłowy jest kompilowany lub zmontowane, wywołanie funkcji DLL generuje odwołanie do funkcji zewnętrznych w kod obiektu.Aby rozwiązać to odwołanie zewnętrzne, aplikacji należy połączyć z import biblioteki (plik .lib) dostarczonych przez producenta do biblioteki DLL.

Import biblioteki zawiera tylko kod załadować biblioteki DLL oraz realizować wywołania funkcji w bibliotece DLL.Znajdowanie funkcji zewnętrznych w bibliotece importu informuje program łączący się kod do tej funkcji w bibliotece DLL.Do rozpoznania odwołań zewnętrznych do bibliotek DLL, linker po prostu dodaje informacje do pliku wykonywalnego, który instruuje system, gdzie można znaleźć kod biblioteki DLL, podczas procesu uruchamiania.

Podczas uruchamiania systemu program, który zawiera odwołania do dynamicznie połączone, używa informacji w pliku wykonywalnego programu zlokalizować wymaganych bibliotek DLL.Jeśli nie może odnaleźć biblioteki DLL, system kończy proces i wyświetla okno dialogowe zgłasza błąd.W przeciwnym razie system mapuje moduły DLL do przestrzeni adresowej procesu.

Jeśli którykolwiek z biblioteki DLL ma funkcję punktu wejścia (dla kodu inicjowania i zakończenie), system operacyjny wywołuje funkcję.Jeden z parametrów przekazanych do funkcji punktu wejścia Określa, że kod oznaczający biblioteki DLL jest dołączenie do procesu.Jeśli funkcja punktu wejścia nie zwraca wartość TRUE, system kończy proces i zgłasza błąd.

Wreszcie system zmienia kod wykonywalny procesu zapewniające adresy początkowe dla funkcji DLL.

Jak reszta kodu programu kod DLL jest mapowany do przestrzeni adresowej procesu, gdy proces uruchamia się i jest ładowany do pamięci tylko wtedy, gdy jest to potrzebne.W rezultacie PRELOAD i LOADONCALL atrybuty kod używany przez pliki o rozszerzeniu def do formantu ładowania w poprzednich wersjach systemu Windows nie jest już mają znaczenie.

Łączenie jawne

Większość aplikacji używa niejawna łączenia, ponieważ jest używana metoda najłatwiejsza łączenia.Istnieją jednak czas, gdy wyraźne powiązanie jest niezbędne.Oto kilka częstych powodów takiego umożliwia łączenie jawne:

  • Aplikacja nie wie nazwę biblioteki DLL, które będą miały do załadowania do czasu wykonywania.Na przykład aplikacja może być konieczne uzyskać nazwę biblioteki DLL i eksportowanych funkcji z pliku konfiguracyjnego.

  • Proces przy użyciu niejawna łączenie jest zakończone przez system operacyjny, jeśli biblioteka DLL nie zostanie znaleziony podczas procesu uruchamiania.Proces przy użyciu jawnych łączenie nie jest zakończona w tej sytuacji i może podjąć próbę odzyskania od błędu.Na przykład proces może powiadomić użytkownika o błąd i użytkownik powinien określić inną ścieżkę do biblioteki DLL.

  • Proces przy użyciu łączenie niejawna również jest przerywane, jeżeli którykolwiek z biblioteki dll, jest ona związana z mają DllMain funkcji, która nie powiedzie się.Proces przy użyciu jawnych łączenie nie jest zakończona w tej sytuacji.

  • Aplikacja, która łączy niejawnie do wielu bibliotek DLL może być powolny się, ponieważ system Windows ładuje wszystkie pliki dll podczas ładowania aplikacji.Aby zwiększyć szybkość uruchamiania się systemu, aplikacji niejawnie można połączyć te biblioteki DLL potrzebne natychmiast po załadowaniu i czekać do łączy wyraźnie do innych bibliotek DLL, gdy są potrzebne.

  • Łączenie jawne eliminuje potrzebę łączenie aplikacji z biblioteką importu.Jeśli zmiany w bibliotece DLL spowoduje liczby porządkowe wywóz do zmiany, aplikacje przy użyciu jawnych łączenie nie trzeba ponownie połączyć (zakładając, że są połączenia GetProcAddress z nazwą funkcji, a nie z wartości porządkowej), podczas gdy aplikacje przy użyciu niejawna łączenia musi Połącz ponownie z nową bibliotekę importu.

Oto dwa zagrożenia jawne łączących się zapoznać:

  • Jeśli biblioteka DLL jest DllMain funkcji punktu wejścia, system operacyjny wywołuje funkcję w kontekście wątek, który wywołał LoadLibrary.Funkcja punktu wejścia nie jest wywoływana, jeśli biblioteka DLL jest już dołączony do procesu z powodu poprzednie wywołanie LoadLibrary z nie odpowiedniego wywołania FreeLibrary funkcji.Wyraźne powiązanie może powodować problemy, jeśli biblioteka DLL jest za pomocą DllMain funkcja do wykonania dla każdego wątku procesu inicjowania, ponieważ wątki istniejące po LoadLibrary (lub AfxLoadLibrary) jest nazywany będzie nie można zainicjować.

  • Jeżeli biblioteka DLL deklaruje zakres statyczne dane jako __declspec(thread), jeśli jawnego może spowodować błąd ochrony.Po załadowaniu biblioteki DLL z LoadLibrary, powoduje błąd ochrony, w każdym przypadku, gdy kod odwołuje się do tych danych. (Dane statyczne zakres obejmuje zarówno globalnym i lokalnym elementy statyczne). Dlatego podczas tworzenia biblioteki DLL należy albo unikać używania pamięci lokalnej wątku lub poinformowania użytkowników DLL o potencjalnych pułapek (w przypadku prób dynamiczne ładowanie).

Co chcesz zrobić?

O czym chcesz się dowiedzieć więcej?

Zobacz też

Koncepcje

Łączenie pliku wykonywalnego z biblioteką DLL