Здравствуйте. Второй день бьюсь с тривиальной задачей загрузки Dll.
Проблема:
Имеется dll, разработка ведется на Win7, VS2010 . Тестирование ведется на машине с WinXP SP3 для отладки там установлена VS2010.
До вчерашнего дня с загрузкой библиотеки никаких проблем не возникало.
Скомпилированная на машине с Win7 библиотека на машине WinXP загружается без проблем,
но скомпилированная на WinXP библиотека не грузится ни на XP ни на Win7 с ошибкой 87 (ERROR_INVALID_PARAMETER).
Размер у библиотек разный.
Рассмотрел вариант с зависимостями с отложенной загрузкой, Dependency Walker ничего не показал.
Написал примитивную тестовую длл и тестовое приложение — результат тот же самый.
Здравствуйте, nugaev.t, Вы писали:
NT>LoadLibrary возвращает 0, GetLastError возвращает код ошибки 87.
Есть такие предположения:
1. dll требует для загрузки библиотек MSVCR или MSVCP нужных версий, которые не установлены.
2. exe и dll слинкованы с разными версиями MSVCR/MSVCP — из-за этого вполне может быть конфликт.
3. У папки C:\Temp отсутствуют права "Read and Execute" для данного пользователя.
Пока все.
Если покажете .vcxproj-файлы обоих проектов (exe и dll), возможно, скажу больше.
Здравствуйте, nugaev.t, Вы писали:
NT>Сейчас проверяю предложенные Вами варианты. Пока выкладываю файлы проектов. NT>...
Что у Вас находится в файле Export.def ?
И еще. Попробуйте в настройках обоих проектов установить конфигурацию Release, а
в опциях компиляции, в разделе Code Generation/Runtime Library задать Multi-Threaded (/MT).
А потом пересобрать оба проекта и проверить — будет работать так или нет.
O>1. dll требует для загрузки библиотек MSVCR или MSVCP нужных версий, которые не установлены.
На сколько я понимаю если компилировать библиотеку и загружать ее на одной и той машине то проблем с версиями MSVCR и MSVCP быть не должно?
O>2. exe и dll слинкованы с разными версиями MSVCR/MSVCP — из-за этого вполне может быть конфликт.
Я пробовал загружать длл из управляемого кода без использования тестового приложения (через DllImport и через PInvoke LoadLibrary), результат тоже ошибочный.
Dll и Exe это проекты одного солюшна, возможно ли чтобы они линковались с разными версиями библиотек MSVCR/MSVCP?
O>3. У папки C:\Temp отсутствуют права "Read and Execute" для данного пользователя.
Пока не могу проверить, моя учетка на этой машине без админских прав. Но мне кажется если были проблемы с правами то
библиотека скомпилированная на Win7 из этой же папки тоже не загружалась. А она прекрасно загружается=(
O>Попробуйте в настройках обоих проектов установить конфигурацию Release, а O>в опциях компиляции, в разделе Code Generation/Runtime Library задать Multi-Threaded (/MT). O>А потом пересобрать оба проекта и проверить — будет работать так или нет.
Попробовал — результат ошибочный.
Здравствуйте, nugaev.t, Вы писали:
O>>Попробуйте в настройках обоих проектов установить конфигурацию Release, а O>>в опциях компиляции, в разделе Code Generation/Runtime Library задать Multi-Threaded (/MT). O>>А потом пересобрать оба проекта и проверить — будет работать так или нет. NT>Попробовал — результат ошибочный.
Мда, не припомню, чтобы такое видел.
Можете выложить куда-нибудь бинарники (exe и dll), а еще лучше — сам Solution ?
Здравствуйте, okman, Вы писали:
O>P.S. O>Файл .sdf и директорию ipch из Solution можно не включать.
Залил бинарники, там рабочая версия библиотеки скомпиленная под Win7 и нерабочая под WinXP + тестовое приложение. Сейчас подготовлю и выложу солюшeн. http://zalil.ru/31901385
Здравствуйте, nugaev.t, Вы писали:
NT>Залил бинарники, там рабочая версия библиотеки скомпиленная под Win7 и нерабочая под WinXP + тестовое приложение.
Удалось заметить вот что:
В рабочей dll-ке, которая собрана под Win7, есть манифест такого содержания:
Опции манифеста задаются в настройках компоновщика (Linker/Manifest File).
Однако в dll-ке, собранной под WinXP, он отсутствует (и в exe его тоже нет — видимо, сам exe
тоже собирался под WinXP).
Попробовал собрать Solution на Windows Server 2008 R2 — в обоих результирующих бинарниках манифест присутствует.
Здравствуйте, nugaev.t, Вы писали:
NT>Спасибо! Сейчас попробую добавить манифест в XP версии прожекта. NT>А у Вас на машине загрузка XP версии библиотеки проходит без ошибок?
Нет, тоже обламывается.
Я еще вот что подумал — может быть, не очень хорошо с точки зрения совместимости
включать файл SDKDDKVer.h ? Ведь он настраивают макросы типа _WIN32_WINNT таким
образом, чтобы они указывали текущую версию Windows. То есть, ту, под которой
выполняется сборка, а не ту, на которой будет выполняться программа.
Для своих проектов я всегда делаю одинаковый файл targetver.h с примерно таким содержанием:
Спасибо за ремарку, нужно будет переделать на свой файл с дефайнами.
Пока решил отложить решение проблемы. Нужно срочно заняться другой задачей. Огромное спасибо за помощь!!!