На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Сложности с разработкой прикладной задачи в MVS на C++

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: Пред. 1 2 3 4 5
RSS
Сложности с разработкой прикладной задачи в MVS на C++
 
Такое сообщение выдается, когда ГИС Панорама не смогла загрузить библиотеку прикладной задачи.
Причина может быть не в самой библиотеке, а, например, в отсутствии другой библиотеки, которую статически загружает Ваша прикладная задача.

Проверить зависимости первой очереди (самой DLL) можно штатной утилитой VS (находится в каталоге bin VS)
Цитата
dumpbin /imports MatrixCalculator.dll > MatrixCalculator.dmp

Предполагаю, что причина в том, что Ваша библиотека пытается использовать библиотеки из Microsoft RunTime Packages той версии, какой Вы используете VS для сборки своей DLL.
Что-то типа msvcr***.dll, где *** - цифра, соответствующая RunTime Package.
Поэтому, на ПК, где отсутствует соответствующий RunTime Package, Ваша DLL не загружается.

Рекомендую выполнять сборку под VS2012 (RunTime Package v.110), так как необходимые библиотеки уже есть в директории ГИС Панорама (msvcr110.dll и др.), а смешивать в одном выполняемом процессе несколько разных RunTime Packages не желательно. Насколько мне известно, у более новых версий VS есть варианты сборки в режиме совместимости в предыдущими RunTime Packages, то есть устанавливать VS 2012 не требуется.
 
Я проверил внешние зависимости моей dll, они оказались следующими:
mapacces64.dll
mfc140d.dll
KERNEL32.dll
USER32.dll
GDI32.dll
OLEAUT32.dll
MSVCP140D.dll
gdiplus.dll
VCRUNTIME140D.dll
VCRUNTIME140_1D.dll
ucrtbased.dll

После этого я собрал свой проект с помощью инструментов VS 2012, правда для этого пришлось всё таки установить VS 2012 со всеми необходимыми компонентами и местами исправить код. Вновь проверил внешние зависимости, они стали следующими:
mapacces64.dll
mfc110d.dll
MSVCR110D.dll
KERNEL32.dll
USER32.dll
GDI32.dll
OLEAUT32.dll
MSVCP110D.dll
ADVAPI32.dll

На моём компьютере прикладная задача, собранная с помощью инструментов VS 2012 также запускается, а на тех ПК, на которых не запускалась, также не запускается и ошибка осталась такой же.
Изменено: Клим Никитский - 29.04.2020 18:22:21
 
Цитата
Клим Никитский написал:
На моём компьютере прикладная задача, собранная с помощью инструментов VS 2012 также запускается, а на тех ПК, на которых не запускалась, также не запускается и ошибка осталась такой же.

Именно потому, что на "тех ПК" не устанавливалась VS и, соответственно, там нет библиотек Visual C++ Redistributable Packages.

Часть этих библиотек от VS2012 уже есть в каталоге ГИС Панорама.
Вам надо проверить наличие необходимых для Вашей задачи библиотек и при необходимости поставлять их вместе с Вашей библиотекой.

Даю подсказку:

mapacces64.dll - это библиотека ГИС-ядра, уже есть в ГИС Панорама

это библиотеки операционной системы (их не надо никуда помещать, они в Windows):
KERNEL32.dll
USER32.dll
GDI32.dll
OLEAUT32.dll
ADVAPI32.dll

Это библиотеки из Visual C++ Redistributable Packages:
mfc110d.dll
MSVCR110D.dll
MSVCP110D.dll

Буква D означает, что свою библиотеку Вы собрали под отладкой (Debug). Для распространения требуется Release и тогда библиотеки будут следующие:
mfc110.dll
MSVCR110.dll
MSVCP110.dll

Смотрим, что же из этого есть в каталоге ГИС "Панорама": только MSVCR110.dll.
Значит, для работы Вашей библиотеки не хватает двух других.
Но это не точно, так как мы рассмотрели зависимости только первого уровня. А те библиотеки могут требовать другие библиотеки и т.д.

Некоторые разработчики не утруждают себя определением необходимого и достаточного состава библиотек и устанавливают на компьютер пользователя весь Visual C++ Redistributable Packages целиком. Он, кстати, потому и называется Redistributable, что его полностью или частично можно распространять со своими разработанными приложениями.

Попробуйте собрать Вашу задачу в Release и вместе с mfc110.dll и MSVCP110.dll разместить в каталог ГИС "Панорама". Если Ваша библиотека успешно загрузится на тех ПК, на которых она не загружалась, то этого достаточно.
Если нет, то надо будет далее искать зависимости библиотек, либо ставить тех ПК, на которых не запускалась Redistributable Packages целиком.

Кстати, посмотреть дерево зависимостей можно и с помощью специальных утилит, например, Process Explorer.
Но это можно сделать только на "успешном" ПК, так как для этого надо загрузить весь процесс с необходимыми dll в память.
 
Я собрал с помощью Release.
Оказалось, что на моём ПК запускается задача, собранная в VS 2019 и с помощью Release, и с помощью Debug, а вот задача, собранная в VS 2012 запускается только, если она собрана с помощью Debug, а если она собрана с помощью Release, то она не запускается. Ошибка такая же, как на других ПК: библиотека моей задачи не найдена. Причём, если закрыть Панораму, а потом открыть и вновь попытаться запустить задачу, то ошибка изменяется на другую, представленную на скриншоте.
На других ПК ошибка не пропала ни при копировании mfc110.dll и MSVCP110.dll, ни при установке распространяемого пакета Visual C++ для Visual Studio 2012 (vcredist_x64.exe), причём при повторной попытке запуска ошибка также изменяется на ошибку на скриншоте.
Изменено: Клим Никитский - 30.04.2020 13:55:02
 
Конфликтуют между собой библиотеки самого Redistributable Packages.
Видимо, версии сборки разные.
Необходимо, чтобы они были из одной сборки.

Замените тогда и ту библиотеку msvcr110.dll, которая входит в состав ГИС Панорама на аналогичную из Вашего Redistributable Packages.

Библиотека msvcr110.dll загружается вместе с ГИС Панорама, после этого Windows будет пытаться загружать и остальные библиотеки именно этой сборки.
Это может оказаться не та версия сборки, с которой слинкована Ваша библиотека, не смотря на то, что и все они как бы от VS 2012.
 
Если удалить библиотеку msvcr110.dll в папке Панорамы, то задача, собранная в VS 2012 с помощью Release работает и на моём компьютере, и на других ПК.
А нельзя ли как-нибудь узнать каким именно образом или в какой именно версии мне нужно собрать мой проект чтобы он был совместим со стандартной библиотекой msvcr110.dll в папке Панорамы? А то не очень удобно получается при несовместимости этой библиотеки с моими.
 
Цитата
Клим Никитский написал:
Если удалить библиотеку msvcr110.dll в папке Панорамы, то задача, собранная в VS 2012 с помощью Release работает и на моём компьютере, и на других ПК.

Это исключительно потому, что Вы установили MS Redistributable Packages 2012 на всех ПК.
Если Вы так и планируете распространять свое приложение, тогда вариант удалить библиотеку msvcr110.dll вполне приемлем (но только если Ваша dll собирается с Redistributable Packages 2012).

Цитата
Клим Никитский написал:
А нельзя ли как-нибудь узнать каким именно образом или в какой именно версии мне нужно собрать мой проект чтобы он был совместим со стандартной библиотекой msvcr110.dll в папке Панорамы? А то не очень удобно получается при несовместимости этой библиотеки с моими.

К сожалению, это не наша прихоть, а Microsoft.
Я скачал с сайта Microsoft текущую сборку распространяемого пакета Visual C++ для Visual Studio 2012 (vcredist_x64.exe). Библиотеки в нем отличаются от тех, которые использованы у нас.
Обновить мы их можем в составе ГИС Панорама, но где гарантия, что завтра Microsoft не обновит снова сборку.

Наверное, самым простым способом будет просто сравнением версий (через свойства файла) сопоставить версии msvcr110.dll из состава ГИС "Панорама" и из скачанного Redistributable Packages 2012.

Еще вариант (лично мне он не очень нравится, но должен работать): Вы собираете свою библиотеку с Redistributable Packages 2017 или 2019 и вместе с ним устанавливаете клиентам. Тогда библиотеки в составе ГИС "Панорама" проверять (удалять/подменять) не надо.
 
Оказалось, что с библиотеками mfc110.dll, MSVCR110.dll, MSVCP110.dll и без установленного распространяемого пакета Visual Studio моя прикладная задача тоже работает, а до этого она не работала только из-за несовместимости версий библиотеки MSVCR110.dll.
Так что вместе с моей задачей достаточно скидывать в корневую папку Панорамы три библиотеки, заменяя библиотеку MSVCR110.dll.
Спасибо за помощь!
 
Чаше всего проблемы именно с этими библиотеками,давно известная история. Но как то решают, вручную чего то меняют и прописывают
Изменено: Олег Лапов - 06.01.2021 16:56:14
Страницы: Пред. 1 2 3 4 5
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности