Могу ли я поймать исключение, относящееся к файлу .DLL, не найденному - PullRequest
2 голосов
/ 03 марта 2010

У меня есть сторонний компонент, который включает в себя файлы .LIB и .DLL. Чтобы использовать компонент, я связываю .LIB с моей программой на C ++ и распространяю .DLL вместе с приложением. Предоставленная функциональность очень специфична и подходит только для небольшой группы моих пользователей, но за распространение .DLL взимается лицензионный сбор.

Одна из работ здесь заключается в том, чтобы иметь две версии моего приложения, одна из которых связана со сторонним компонентом, а другая - нет, но я бы предпочел избежать дополнительного времени, связанного с поддержкой и распространением второй сборки.

В идеале я хотел бы просто исключить .DLL из дистрибутива, но если я сделаю это, я получу ошибку 'Это приложение не запустилось, поскольку XXXXX.DLL не был найден. Переустановка приложения может решить эту проблему '. Это исключение, которое я могу поймать и разобраться в моем коде? В качестве альтернативы, можно ли отложить загрузку .DLL до тех пор, пока не будет предпринята попытка вызвать конкретную предоставленную функциональность и затем обработать ее, или просто проверить наличие .DLL и действовать соответствующим образом?

Среда - VS 2003 и VS 2008.

Ответы [ 4 ]

5 голосов
/ 03 марта 2010

Нет способа остановить привязку после связывания с dll. Единственный способ, которым вы обладаете, - это если вы динамически загружаете DLL во время выполнения.

Разрешение Dll выполняется до запуска вашего exe. Код может выглядеть как-то так. Если это не работает для вашей сторонней dll, вы можете написать собственную dll, которая обернет стороннюю dll и которая может быть загружена динамически во время выполнения.

HINSTANCE lib = LoadLibraryEx("C:\dlls\thirdparty.dll", NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
if(0 != lib) {
    // Dll is present so use it
    typedef  CObj ( __cdecl *tFunction ) (const wchar_t*, const int&);
    tFunction functionEntry = (tFunction)(GetProcAddress( lib,"EntryFunction"));

    assert(0 != functionEntry);
    // call the function
    CObj obj = functionEntry(L"Hello", 1);
}
else {
    // dll not present
}

Обновление: пожалуйста, убедитесь, что вы используете fullpath для вашей dll, чтобы убедиться, что ни одна dll не извлечена с таким именем.

5 голосов
/ 03 марта 2010

Visual Studio поддерживает DLL с задержкой загрузки . Используя эту функцию, DLL загружается при первом вызове функции из этой библиотеки. Но вы должны проверить лицензию вашего компонента, чтобы узнать, разрешено ли это.

3 голосов
/ 03 марта 2010

Вы можете использовать функцию LoadLibrary для явной загрузки DLL и проверки результата. В случае успеха используйте GetProcAddress, чтобы найти CreateMyInterfaceImpl функцию. В противном случае используйте ложную реализацию вашего интерфейса или не используйте ее вообще.

3 голосов
/ 03 марта 2010

Вы можете загрузить DLL динамически, используя функцию API LoadLibrary () Но тогда вы должны использовать GetProcAddress () для каждой функции, экспортируемой DLL, которую ваше приложение должно вызывать.

...