Udostępnij za pośrednictwem


Run-Time łączenie dynamiczne

Gdy aplikacja wywołuje funkcje LoadLibrary lub LoadLibraryEx, system próbuje zlokalizować bibliotekę DLL (aby uzyskać szczegółowe informacje, zobacz Dynamic-Link Order wyszukiwania biblioteki). Jeśli wyszukiwanie zakończy się pomyślnie, system mapuje moduł DLL na wirtualną przestrzeń adresową procesu i zwiększa liczbę odwołań. Jeśli wywołanie metody LoadLibrary lub LoadLibraryEx określa bibliotekę DLL, której kod jest już mapowany na wirtualną przestrzeń adresową procesu wywołującego, funkcja po prostu zwraca uchwyt do biblioteki DLL i zwiększa liczbę odwołań bibliotek DLL. Należy pamiętać, że dwie biblioteki DLL, które mają taką samą nazwę pliku podstawowego i rozszerzenie, ale znajdują się w różnych katalogach, nie są uważane za tę samą bibliotekę DLL.

System wywołuje funkcję punktu wejścia w kontekście wątku o nazwie LoadLibrary lub LoadLibraryEx. Funkcja punktu wejścia nie jest wywoływana, jeśli biblioteka DLL została już załadowana przez proces za pomocą wywołania loadLibrary lub LoadLibraryEx bez odpowiedniego wywołania funkcji FreeLibrary.

Jeśli system nie może odnaleźć biblioteki DLL lub jeśli funkcja punktu wejścia zwróci wartość FALSE, LoadLibrary lub LoadLibraryEx zwraca wartość NULL. Jeśli loadLibrary lub LoadLibraryEx powiedzie się, zwraca uchwyt do modułu DLL. Ten proces może użyć tego uchwytu, aby zidentyfikować bibliotekę DLL w wywołaniu funkcji GetProcAddress, FreeLibrarylub FreeLibraryAndExitTh read.

Funkcja GetModuleHandle zwraca uchwyt używany w GetProcAddress, FreeLibrarylub FreeLibraryAndExitThread. Funkcja GetModuleHandle powiedzie się tylko wtedy, gdy moduł DLL jest już zamapowany na przestrzeń adresową procesu przez łączenie w czasie ładowania lub przez poprzednie wywołanie LoadLibrary lub LoadLibraryEx. W przeciwieństwie do loadLibrary lub LoadLibraryExGetModuleHand le nie zwiększa liczby odwołań modułu. Funkcja GetModuleFileName pobiera pełną ścieżkę modułu skojarzonego z dojściem zwróconym przez GetModuleHandle, LoadLibrarylub LoadLibraryEx.

Proces może użyć GetProcAddress, aby uzyskać adres wyeksportowanej funkcji w bibliotece DLL przy użyciu dojścia modułu DLL zwróconego przez LoadLibrary lub LoadLibraryEx, GetModuleHandle.

Gdy moduł DLL nie jest już potrzebny, proces może wywołać FreeLibrary lub FreeLibraryAndExitThread. Te funkcje dekrementuje liczbę odwołań modułu i anuluje mapowanie kodu DLL z wirtualnej przestrzeni adresowej procesu, jeśli liczba odwołań wynosi zero.

Łączenie dynamiczne w czasie wykonywania umożliwia kontynuowanie działania procesu, nawet jeśli biblioteka DLL jest niedostępna. Następnie proces może użyć alternatywnej metody, aby osiągnąć swój cel. Jeśli na przykład proces nie może zlokalizować jednej biblioteki DLL, może spróbować użyć innej lub powiadomić użytkownika o błędzie. Jeśli użytkownik może podać pełną ścieżkę brakującej biblioteki DLL, proces może użyć tych informacji do załadowania biblioteki DLL, mimo że nie znajduje się w normalnej ścieżce wyszukiwania. Ta sytuacja kontrastuje z łączeniem w czasie ładowania, w którym system po prostu kończy proces, jeśli nie może znaleźć biblioteki DLL.

Łączenie dynamiczne w czasie wykonywania może powodować problemy, jeśli biblioteka DLL używa funkcji DllMain do wykonywania inicjowania dla każdego wątku procesu, ponieważ punkt wejścia nie jest wywoływany dla wątków, które istniały przed LoadLibrary lub LoadLibraryEx jest wywoływana. Przykład pokazujący sposób radzenia sobie z tym problemem, zobacz Using Thread Local Storage in a Dynamic-Link Library(Używanie magazynu lokalnego wątku w bibliotece Dynamic-Link).

przy użyciu funkcji dynamicznego łączenia w czasie wykonywania