Udostępnij za pośrednictwem


Określenia, która metoda łączenia do użycia

Istnieją dwa typy łączenia: łączenie niejawna i jawnego łączenia.

Łączenie niejawne

Łączenie niejawna występuje, gdy kod aplikacji wywołuje wyeksportowanej funkcji DLL.Kod źródłowy dla wywołującego pliku wykonywalnego jest kompilowany lub zmontowane, wywołanie funkcji DLL generuje odwołanie zewnętrzne funkcji w kodzie obiekt.Rozpoznać tego odwołania zewnętrzne, aplikacja musi połączyć się z biblioteki import (plik .lib), dostarczone przez producenta biblioteki DLL.

Biblioteki import zawiera tylko kod załadować biblioteki DLL i wykonania wywołania funkcji w bibliotece DLL.Znajdowanie funkcji zewnętrznej biblioteki import informuje program łączący, że kod dla tej funkcji jest w bibliotece DLL.Aby rozwiązać odwołania zewnętrzne do biblioteki DLL, łączący po prostu dodaje informacje do pliku wykonywalnego, który informuje system, gdzie można znaleźć kod biblioteki DLL podczas uruchamiania procesu.

Gdy system uruchamia program, który zawiera odniesienia 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 dowolna inna funkcja 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 biblioteki DLL jest przyłączanie do procesu.Jeśli funkcja punktu wejścia nie zwraca wartość TRUE, system kończy proces i zgłasza błąd.

Wreszcie system modyfikuje kodu wykonywalnego procesu w celu zapewnienia adresy początkowe dla funkcji DLL.

Reszta kodu programu, takich jak kod biblioteki DLL jest mapowana do przestrzeni adresowej procesu podczas procesu uruchamiania i jest ładowany do pamięci tylko w razie potrzeby.W wyniku PRELOAD i LOADONCALL atrybuty kod używany przez pliki .def kontroli załadunku w poprzednich wersjach systemu Windows nie ma znaczenia.

Dołączanie jawne

Większość aplikacji używa niejawnym dołączaniu, ponieważ jest używana metoda najprostszy łączenia.Istnieją jednak czas, gdy jawnego łączenia jest niezbędne.Poniżej przedstawiono niektóre typowe przyczyny, aby użyć jawnego łączenia:

  • Aplikacja nie zna nazwę biblioteki DLL, która będzie załadować do czasu wykonywania.Na przykład aplikacja może być konieczne uzyskanie nazwę biblioteki DLL i eksportowanych funkcji z pliku konfiguracji.

  • Proces przy użyciu niejawnym dołączaniu zostaje zakończone przez system operacyjny, jeśli nie można odnaleźć biblioteki DLL podczas uruchamiania procesu.Proces, za pomocą jawnego łączenia nie jest zakończona w tej sytuacji i może próbować odzyskać błędu.Na przykład proces może powiadomić użytkownika o błędzie i użytkownika, określ inną ścieżkę do biblioteki DLL.

  • Proces przy użyciu niejawnym dołączaniu również jest zakończony, jeśli dowolny z biblioteki DLL, jest on połączony mają DllMain funkcja nie działa.Proces, za pomocą jawnego łączenia nie jest zakończona w tej sytuacji.

  • Aplikacja, która jest niejawnie łączy do wielu bibliotek DLL może być powolne, ponieważ system Windows ładuje wszystkie biblioteki DLL podczas ładowania aplikacji.Aby zwiększyć wydajność uruchamiania, aplikacja niejawnie można połączyć się z tych bibliotek DLL potrzebne natychmiast po załadowaniu i oczekiwania jawnie połączyć z innych bibliotek DLL, gdy są potrzebne.

  • Dołączanie jawne eliminuje konieczność łączenie aplikacji z biblioteki import.Jeśli zmiany w bibliotece DLL spowodować porządkowe eksportu zmienić, aplikacji za pomocą jawnego łączenia nie trzeba ponownie połączyć (przy założeniu wywoływane są GetProcAddress z nazwą funkcji, a nie z wartości porządkowej), natomiast aplikacje przy użyciu niejawnym dołączaniu musi ponownie połączyć nową bibliotekę importu.

Oto dwa zagrożenia jawnego łączenia, należy zwrócić uwagę:

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

  • Jeżeli biblioteka DLL deklaruje static zakres danych jako __declspec(thread), może spowodować błąd ochrony, jeśli połączone w sposób jawny.Po załadowaniu biblioteki DLL z LoadLibrary, powoduje błąd ochrony, w każdym przypadku, gdy kod odwołuje się do tych danych.(Static zakres danych obejmuje zarówno globalnego, jak i lokalnym elementy statyczne). W związku z tym tworząc bibliotekę DLL, należy unikać używania pamięci lokalnej wątku lub informować DLL użytkowników o potencjalnych pułapki (w przypadku prób dynamicznego ładowania).

Co chcesz zrobić?

Co chcesz wiedzieć więcej?

Zobacz też

Koncepcje

Łączenie pliku wykonywalnego do biblioteki DLL