Определение существования DLL перед ее использованием
-
20-09-2019 - |
Вопрос
Использование Visual C++ 2008 Express Edition.Я связываю свое приложение с библиотекой импорта (.lib
) для DLL, которая может присутствовать или отсутствовать в целевой системе.Прежде чем спросить:Я не могу распространять DLL вместе с моим приложением.
Если DLL отсутствует, то как только я вызываю функцию из DLL (но не раньше!), я получаю сообщение типа
Не удалось запустить это приложение, поскольку файл SomeLibrary.dll не найден.Переустановка приложения может решить проблему.
Вместо этого я хочу, чтобы приложение обнаружило, что DLL отсутствует, и просто отключило зависящие от нее функции.Я мог бы позвонить LoadLibrary
и посмотрим, удалось ли это, но я не уверен, достаточно ли этого.Может быть, библиотека импорта выполняет больше скрытой работы?
Это простой LoadLibrary
позвонить достаточно?Если нет, что еще мне нужно сделать?Можно ли это вообще сделать?
Обновлять:Конечно, я могу использовать LoadLibrary
, а потом GetProcAddress
для каждой функции, которую я хочу использовать.Но это хлопотно, и я надеялся избежать этого и просто использовать вместо этого предоставленную библиотеку импорта.
Решение
Для этого предназначена опция компоновщика DelayLoad, но я не знаю, поддерживает ли ее версия Express.
Другие советы
Нет, LoadLibrary()
это именно то, что вы хотите.Единственным последствием его использования является сложность настройки указателей функций в DLL при успешной загрузке DLL, но этот процесс хорошо описан в других местах в сети.
Если пойдешь, проверь здесь (MSDN) вы увидите это, когда LoadLibrary
не загружается, функция возвращает значение NULL, и вы даже можете проверить конкретную ошибку (это должен быть файл, который не найден), используя GetLastError
функция.