Проапгредился на 2013 студию с 2012. Все прошло гладко, за исключением, что прога перестала запускаться на Win XP.
Что бы не заморачиваться со старым проектом, для пробы создал новый MFC диалоговый проект. В тулсете установил V120_xp,
Указал в его свойствах статическую сборку. После сборки программа не запускается на ХР.
Выдает — is not a valid Win32.
На депенсе определил, что прога ищет в kernel32.dll InitializeCriticalsectionEx(), которой нет. Правильно, откуда ей взяться в ХР!
Значит тулсет V120_xp в 2013 студии до лампочки? В VS2012 такой фигни не было.
У меня стоит VS2013 Ultimate Update 5. Прогу собирал на 10 винде.
Здравствуйте, Vicul, Вы писали:
V>Проапгредился на 2013 студию с 2012. Все прошло гладко, за исключением, что прога перестала запускаться на Win XP.
V>Что бы не заморачиваться со старым проектом, для пробы создал новый MFC диалоговый проект. В тулсете установил V120_xp, V>Указал в его свойствах статическую сборку. После сборки программа не запускается на ХР. V>Выдает — is not a valid Win32. V>На депенсе определил, что прога ищет в kernel32.dll InitializeCriticalsectionEx(), которой нет. Правильно, откуда ей взяться в ХР!
Вообще-то всё вполне логично: функция InitializeCriticalsectionEx() начала поддерживаться от Windows Vista.
Убирай её вызов из своего кода (или заменяй на InitializeCriticalsection) и всё будет OK!
Вот подробности: https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms683477(v=vs.85).aspx
V>Значит тулсет V120_xp в 2013 студии до лампочки?
Нет, это не так. В этом плане — всё выставлено правильно.
V>В VS2012 такой фигни не было.
В этом смысле не подскажу, я пользовался VS2013 и VS2015.
Даже если вызов InitializeCriticalsectionEx() как-то "проглатывался" при компиляции и линковке на VS2012,
не факт что он успешно отработает на Win XP
V>У меня стоит VS2013 Ultimate Update 5. Прогу собирал на 10 винде.
Предполагаю, что сборка на любой современной (от Windows-7 и новее) ОС даст аналогичный результат.
V>Кто, что посоветует?
Ввести некоторый флаг препроцессора (для условной компиляции), который определяет — будет старая винда или нет.
Примерно так:
#ifdef USE_OLD_WIN_XP // If use OLD Windows (Windows XP):
// Делаем то, что ГАРАНТИРОВАННО поддерживается на Windows XP
...
#else// If use contemporary Windows:
// Делаем то, что поддерживается на современных Windows
...
#endif
Здравствуйте, Vicul, Вы писали:
V>Кто, что посоветует?
В VC2015 надо добавить ключ /D_USING_V110_SDK71_ /link /SUBSYSTEM:WINDOWS,5.01
Если быстро попробывать то есть архив 72Мб VC2015+x64mfc.src (распакуется в 750Мб). Устанавливается в течении 1мин
В директории usage пример использования. Он собирает для winxp
AG>Убирай её вызов из своего кода (или заменяй на InitializeCriticalsection) и всё будет OK!
если бы все так было просто.
в боевом проекте солюшен насчитывает более 30 проектов. А эта бяка вылезла на длл-ках с opencv, которую я сам собирал
на том же 2013 с v120-xp. А в солюшене opencv за сотню проектов. И все 42 длл-ки идут с вызовом InitializeCriticalsectionEx.
На тестовой проге, там она где то внутри. Я в визарде создал диалоговое окно МФС с двумя кнопками — ok и cancel.
Ну чтобы она только показывала это окно. Поэтому по любому должна запускаться на ХР.
Здравствуйте, kov_serg, Вы писали:
_>Здравствуйте, Vicul, Вы писали:
V>>Кто, что посоветует?
_>В VC2015 надо добавить ключ /D_USING_V110_SDK71_ /link /SUBSYSTEM:WINDOWS,5.01
_>Если быстро попробывать то есть архив 72Мб VC2015+x64mfc.src (распакуется в 750Мб). Устанавливается в течении 1мин _>В директории usage пример использования. Он собирает для winxp
AG>>Убирай её вызов из своего кода (или заменяй на InitializeCriticalsection) и всё будет OK! V>если бы все так было просто.
OpenCV говоришь...
Занималсись мы довольно много на OpenCV, правда всё делали под Win-7.
Мы применяли OpenCV v 2.4 (она и по сей день доступна на https://sourceforge.net/projects/opencvlibrary ).
Попутно замечу, что никаких проблем в этом плане — ни с MFC, ни с Qt5 у нас НЕ БЫЛО (правда, всё под Win-7).
V>в боевом проекте солюшен насчитывает более 30 проектов. А эта бяка вылезла на длл-ках с opencv, которую я сам собирал
Ты собирал OpenCV v 3.3?
Если взять более раннюю версию OpenCV, совместимую с Win-XP (ту же OpenCV v 2.4)? Этот вариант реален?
Хотя бы, для поддержки Win-XP...
V>на том же 2013 с v120-xp.
То есть, сборка с вызовами InitializeCriticalsectionEx проходила под тулсет v120-xp?
Странно. Может быть, этот материал окажется актуален: https://github.com/opencv/opencv/issues/9817
V>А в солюшене opencv за сотню проектов. И все 42 длл-ки идут с вызовом InitializeCriticalsectionEx.
То есть — вариант перехода но более старую библиотеку OpenCV — актуален. Не знаю, правда, возможно ли это по ТЗ в твоём случае.
V>На тестовой проге, там она где то внутри. Я в визарде создал диалоговое окно МФС с двумя кнопками — ok и cancel. V>Ну чтобы она только показывала это окно. Поэтому по любому должна запускаться на ХР.
Sorry, не распарсил последние две строки — зачем "диалоговое окно МФС с двумя кнопками — ok и cancel"??? Суть этого действия???
Заменил вызов InitializeCriticalsection на что-то другое?
Или я здесь что-то не так понял?
Имея исходники, я бы всё-же попытался вызывать InitializeCriticalsection, вместо InitializeCriticalsectionEx.
Конечно, для этого потребуются некоторые изменения в существующих кодах...
Или же применнеие более ранней библиотеки OpenCV v 2.4.
V>>в боевом проекте солюшен насчитывает более 30 проектов. А эта бяка вылезла на длл-ках с opencv, которую я сам собирал AG>Ты собирал OpenCV v 3.3?
Кстати — возможен вариант, что сборка OpenCV v 3.3, производимая через CMake,
применяет те или иные опции, запрещенные для Win-XP?
Здравствуйте, Vicul, Вы писали:
V>Здравствуйте, kov_serg, Вы писали:
_>>Здравствуйте, Vicul, Вы писали:
V>>>Кто, что посоветует?
_>>В VC2015 надо добавить ключ /D_USING_V110_SDK71_ /link /SUBSYSTEM:WINDOWS,5.01
_>>Если быстро попробывать то есть архив 72Мб VC2015+x64mfc.src (распакуется в 750Мб). Устанавливается в течении 1мин _>>В директории usage пример использования. Он собирает для winxp
V>У меня 2013. Но за наводку спасибо
Хз у меня сечас нету 2013-он ни на одной из машин. Но думаю что примерно так же как и в 2015.
AG>Sorry, не распарсил последние две строки — зачем "диалоговое окно МФС с двумя кнопками — ok и cancel"??? Суть этого действия???
Что бы проверить работает ли опция тулсет v120-xp на 2013 вооще. Результаты показали — не работает. Поэтому пока смысла лесть в opencv
не вижу.
Отвечаю на вопрос, как собиралась opencv — последняя версия 3.3.0, конфигурилась на CMake, опция v120-x была установлена и появилась на всех проектах
opencv, билдилась на 2013.
Здравствуйте, Vicul, Вы писали:
V> V>Что бы проверить работает ли опция тулсет v120-xp на 2013 вооще. Результаты показали — не работает. Поэтому пока смысла лесть в opencv V>не вижу.
1) Опция v120-xp на MSVC-2013 Update 5 работает.
Простое диалоговое приложение — собирается, запускается (пробовал под Win-7, сейчас нет под рукой возможности запустить на Win-XP).
Ранее, пару лет назад, портирование на MSVC-2013 (v120-xp) я провёл для продукта, разработанного тогда мною,
на старой работе: http://www.ensytech.com/sistemnye_resheniya/pak_titan_-vodosnabzhenie (MFC, в солюшене несколько десятков проектов).
Тогда всё успешно проверялось в работе под XP.
Работает, я сделал тестовое консольное приложение, типа Hello World.
ОС на переключение тулсета реагирует, значит все — ок.
2. Почему тулсет не отрабатывал тестовое MFC приложение.
До конца не разобрался — просто если создавать с нуля mfc окно, оно создается без поддержки ХР.
Но во всех прогах, которые я проапгредил с 2012, тулсет срабатывал. Будет время докапаюсь и до этого.