Kiedy należy implicite lub jawnie link do biblioteki DLL i jakie są powszechne praktyki lub pułapki?Implicit vs. Explicit linking to DLL
Odpowiedz
Dość rzadko można jawnie połączyć bibliotekę DLL. Głównie dlatego, że jest bolesny i podatny na błędy. Musisz napisać deklarację wskaźnika funkcji dla wyeksportowanej funkcji i uzyskać prawo do LoadLibrary + GetProcAddress + FreeLibrary. Można to zrobić tylko wtedy, gdy potrzebna jest zależność środowiska wykonawczego od biblioteki DLL typu plug-in lub jeśli chcemy wybierać z zestawu bibliotek DLL na podstawie konfiguracji. Lub poradzić sobie z wersją, funkcja API dostępna tylko w późniejszych wersjach Windows. Jawne łączenie jest domyślne dla bibliotek COM i .NET DLL.
Więcej informacji dodatkowych w tym MSDN Library article.
Zakładam, że odwołujesz się do łączenia za pomocą .lib
vs dynamicznie ładując bibliotekę DLL przy użyciu LoadLibrary()
.
Załadowanie statycznej biblioteki DLL za pomocą linku do jej .lib
jest ogólnie bezpieczniejsze. Etap łączenia sprawdza, czy wszystkie punkty wejścia istnieją w czasie kompilacji i nie ma szansy, aby załadować bibliotekę DLL, która nie ma oczekiwanej funkcji. Łatwiej też nie trzeba używać GetProcAddress()
.
Zasadniczo należy stosować dynamiczne ładowanie tylko wtedy, gdy jest to absolutnie wymagane.
Zgadzam się z innymi, którzy już odpowiedzieli (Hans Passant and shoosh). Chcę dodać tylko dwie rzeczy:
1) Jeden wspólny scenariusz, gdy trzeba użyć LoadLibrary
i GetProcAddress
jest następujący: chcesz wykorzystać jakieś nowe API istniejącego w nowych wersjach tylko Windows, ale API nie są krytyczne w swojej podanie. Więc przetestuj z LoadLibrary
i GetProcAddress
, czy funkcja, którą potrzebujesz, istnieje i użyj go w przypadku. To, co robi twój program, jeśli funkcje nie istnieją, zależy od twojej implementacji.
2) Istnieje jedna ważna opcja, której nie dotyczy pytanie: delayed loading of DLLs. W takim przypadku system operacyjny załaduje bibliotekę DLL po wywołaniu jednej z jej funkcji, a nie po uruchomieniu aplikacji. Umożliwia korzystanie z bibliotek importu (pliki .lib
) w niektórych scenariuszach, w których na pierwszy rzut oka należy zastosować jawne łączenie. Ponadto poprawia czas uruchamiania aplikacji i jest szeroko stosowany przez sam system Windows. Więc zalecana jest również droga.
Ładowanie opóźnienia jest realizowane przez program Visual Studio linker, a nie system operacyjny. Wstawia odpowiednie wywołania 'LoadLibrary' i' GetProcAddress'. System operacyjny nie jest świadomy, kto wykonał te połączenia. Właśnie dlatego działa z powrotem do Window 95, mimo że funkcja została wprowadzona w 98. – MSalters
@MSalters: Mylisz się. Program Deployment Executable (PE) wykorzystujący obciążenie opóźnione ma dodatkową sekcję 'IMAGE_DIRECTORY_DRY_DELAY_IMPORT'. – Oleg
- 1. Dlaczego funkcja Implicit DLL Linking wymaga odpowiedniego pliku Lib, ale nie ma linku do funkcji Explicit Linking?
- 2. Implicit Lazy Loading vs Explicit Lazy Loading
- 3. Implicit conversion to Runnable?
- 4. Selenium implicit wait vs Thread.sleep()
- 5. Swift Explicit vs. Inferred Wpisanie: Wydajność
- 6. Gradle klienta Plugin: gradleApi() vs Explicit Zależność
- 7. Co to jest $ implicit in angle 2?
- 8. DllImport user32 vs user32.dll
- 9. Explicit Typ Powrót Lambda
- 10. Używanie Cuda Object Linking with Cmake
- 11. Statyczna kompilacja błędu Qt Qt5Network linking
- 12. jQuery. $ (This) vs. to $()
- 13. Jawne zamki kontra Implicit Locks
- 14. Implicit Intent nie jest wywoływany
- 15. Tensor Flow Explicit Device Requirement Error
- 16. Ruby: ProC# call vs yield
- 17. svn help ignorując folder: 'Explicit cel wymagany'
- 18. Angline 2.0 deep-linking nie działa. To samo z paska adresu.
- 19. $ (this) vs to w jQuery
- 20. Implicit konwersji z int do wektora?
- 21. Typ funkcji z parametrami Implicit w Scala
- 22. Aktualizacja biblioteki DLL
- 23. Prawdę iniekcji DLL z aplikacji metro, Nektra vs Komodia
- 24. PayPal Płatności adaptacyjne IMPLICIT Pay API
- 25. System wtyczek do aplikacji Delphi - bpl vs dll?
- 26. Ładowanie pliku DLL w java
- 27. Niejednoznaczność w wywołaniu funkcji. Implicit konwersji?
- 28. Priorytet Implicit ExecutionContext w Scali 2.12
- 29. Implicit Constraint iPhone Portrait Screen Height
- 30. zadeklarować funkcji `` implicit` type` z parametrami
co masz na myśli przez wyraźne kontra ukryte? masz na myśli używanie LoadLibrary lub statycznego linkowania? – tenfour
@tenfour niejawny jest gdy używasz .h i musisz połączyć z .lib i jawnie, gdy użyjesz odpowiednio LoadLibrary i GetProcAddress. Statyczne łączenie to kolejna guma do żucia. – Shinnok
Czasem używasz jawnie, gdy nie masz do dyspozycji pliku .lib. –