как использовать SetDllDirectory?
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Вообщем ситуация такая: есть программа ЯВНО подключающая длл. (то есть через load library) . Хочу чтобы экзешник запускался на любом компьютере. Для этого надо на тот компьютер перенести exe и dll. но если после этого просто запустить прогу то она длл не найдет. поэтому я использую функцию SetDllDirectory(".\\dll"); - то есть указываю своей программе что надо искать длл в папке DLL. на моем компе программа отрабатывает нормально и грузит оттуда длл, если переписать все это на сетевой диск и запустить с моего компа, то тоже грузит. а если зайти туда же с другого компьютера то не находит! В чем проблема?
Как указать программе директорию, из которой она должна загружать все длл? Точнее я это и делаю, но почему работает только на моем компьютере?
Как указать программе директорию, из которой она должна загружать все длл? Точнее я это и делаю, но почему работает только на моем компьютере?
А почему бы не указать полный путь к файлу прямо в функции LoadLibrary?
Но если "мистика" начинается в сети, то, может, на том проблемном компьютере или этот каталог (сетевой) не виден, или прав каких-нибудь не хватает.
Но если "мистика" начинается в сети, то, может, на том проблемном компьютере или этот каталог (сетевой) не виден, или прав каких-нибудь не хватает.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Указание пути как ".\\dll" плохо. Достаточно запустить exe файл не из той же директории, в которой он расположен для того, чтобы всё перестало работать.
Правильно делать так. Берём полное путь к exe, отрезаем имя exe файла, добавляем "dll\\", потом добавляем имя dll-ки, и эту строку используем в LoadLibrary. В таком случае нужда в вызове SetDllDirectory отпадёт.
Ещё один один минус функции SetDllDirectory в том, что она работает только на Vista или XP c SP1 или старшим сервис паком, так что на Win2000 или том же XP без сервис пака, работать уже не будет.
Правильно делать так. Берём полное путь к exe, отрезаем имя exe файла, добавляем "dll\\", потом добавляем имя dll-ки, и эту строку используем в LoadLibrary. В таком случае нужда в вызове SetDllDirectory отпадёт.
Ещё один один минус функции SetDllDirectory в том, что она работает только на Vista или XP c SP1 или старшим сервис паком, так что на Win2000 или том же XP без сервис пака, работать уже не будет.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Да проблема в том что SetDllDirectory по идее вообще можно не использовать! По умолчанию поиск длл должен начинаться с той же папки в которой находится exe-ник. Но если просто записать длл в ту же папку то она все равно не открывается на других компьютерах...
можно и исходник привести, только он взят из примеров к вижул студии так что думаю смысла нет
"мистика" с сетью не связана, вот сейчас притащил проект домой и тут то же самое(
можно и исходник привести, только он взят из примеров к вижул студии так что думаю смысла нет
"мистика" с сетью не связана, вот сейчас притащил проект домой и тут то же самое(
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Предлагаю узнать по какой причине не отрабатывает LoadLibrary. Узнать описание ошибки можно с помощью функции GetLastError.
Один из возможных вариантов это то, что dll байндит (то есть статически линкует) другие dll, которые есть на исходном компьютере, но которых нет на твоём домашнем компьютере. Проверить верно ли это предположение легко. Достаточно открыть dll'ку на своём домашнем PC с помощью программы Dependency Walker. Если в библиотеке есть линки на несуществующие библиотеки, то линки будут помечены красным. Программа входит в интрументарий VC 6.0 либо без проблем вытаскивается из интернета.
Один из возможных вариантов это то, что dll байндит (то есть статически линкует) другие dll, которые есть на исходном компьютере, но которых нет на твоём домашнем компьютере. Проверить верно ли это предположение легко. Достаточно открыть dll'ку на своём домашнем PC с помощью программы Dependency Walker. Если в библиотеке есть линки на несуществующие библиотеки, то линки будут помечены красным. Программа входит в интрументарий VC 6.0 либо без проблем вытаскивается из интернета.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Точно-точно! Грабли вечные, стреляющие очень часто. И даже если при этом в программе честно выводится сообщение "DLL.DLL не найдена", юзеры в этом случае не просто в шоке, а страшно озлоблены. Мол, как найдена, когда вот она - рядом лежит! В свое время пришлось доого и упорно учить наших внедренцев пользоваться Dependency Walker-омRomeo писал(а):Один из возможных вариантов - dll байндит (то есть линкует статически) другие dll, которые есть на исходном компьютере, но их на твоём домашнем компьютере. Проверить верно ли это предположение легко. Достаточно открыть dll'ку на своём домашнем PC с помощью программы Dependency Walker. Программа входит в интрументарий VC 6.0 либо без проблем вытаскивается из интернета.

Проще сразу установить на компьютер пользователя комплект поддержки MSVCRT. Его дистрибутив доступен на сайте Microsoft в Центре загрузки или в Центре разработки.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Такое сообщение выводится при статической линковке. При динамической линковке просто наворачивается LoadLibrary и за вывод читабельного сообщения уже отвечает программист." писал(а):И даже если при этом в программе честно выводится сообщение "DLL.DLL не найдена"
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.