Home > itblogs > “This program requires Windows 2000 or newer operating system”.

“This program requires Windows 2000 or newer operating system”.

March 25th, 2009

Когда видишь такое сообщение на Windows 7, это означает, что разработчики приложения допустили ошибку либо в коде проверки версии операционной системы, либо, что менее вероятно, – в самом сообщении. Второй вариант возможен, если программа действительно не должна работать в новых версиях операционной системы. В обоих случаях, с точки зрения пользователя это чистой воды баг. То ли в коде, то ли в дизайне, то ли в маркетинговом отделе…

В любом случае обходятся такие ограничения элементарно просто. Достаточно открыть окно свойств исполняемого файла или ярлыка, выбрать вкладку «совместимость» и в выпадающем списке выбрать нужную версию операционной системы. При следующем запуске, программа будет запущена вместе с набором заплаток, которые в том числе подменяют номер версии системы:

appcompat
  1. March 25th, 2009 at 22:01 | #1

    Когда узнал, что строгое равенство при проверке версии является основной проблемой совместимости, был очень удивлен. Что движет разработчиком, когда он проверяет строго, что версия равна 5?
    Мне кажется это из-за того, что версии Windows не всегда major версию прибавляют. Вот и в Windows 7 оставили версию 6.1.7000…

    А эта закладка Compatibility позволяет обходить ограничения, если продукт и правда привязан к конкретной версии Windows лицензией.

  2. March 25th, 2009 at 23:02 | #2

    Ну это прям совсем маленькая хитрость. Ну прям малюсенькая при малюсенькая и на таком блоге. Или вас достали программы, в которых программы не умеют проверять версию? Я был на конференции для партнеров MS и там говорили, что 54% всех проблем несовместимости с Vista – это неверная проверка версии и поэтому в Windows 7 не стали менять версию, а оставили 6, но изменили подверсию на 1. В принципе, это же и логично, ведь перед нами будет та же Vista, но в улучшенном обличии.

  3. March 26th, 2009 at 00:34 | #3

    Я уже писал тебе как-то в комментах, что это не прокатывает, например, с последней Nokia PC Suite.

    А ещё это не прокатывает с Windows Live Suite в Windows 2003. В Микрософте тоже есть идиоты.

  4. March 26th, 2009 at 06:34 | #4

    это не прокатывает, например, с последней Nokia PC Suite.
    А ещё это не прокатывает с Windows Live Suite в Windows 2003.

    Этот способ никак не претендует на звание серебряной пули. :-)

  5. March 26th, 2009 at 06:35 | #5

    Ну это прям совсем маленькая хитрость. Ну прям малюсенькая при малюсенькая и на таком блоге.

    Я как-то не уловил сарказма. У меня какой-то особенный блог, что здесь нельзя об этом писать?

  6. Pavel
    March 27th, 2009 at 01:53 | #6

    Если бы со времен появления Win32 API была бы функция, которая возвращала пару чисел (major version, minor version) и эта бы функция не менялась в том числе и по названию и по параметрам включая и NET Framework, то можно было бы говорить, что разработчики не умеют проверять версию, а так чистой воды design bug от Microsoft

    я своих программах никогда версию не проверяю ибо слишком изменчива эта процедура

  7. March 27th, 2009 at 04:01 | #7

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

  8. March 27th, 2009 at 08:28 | #8

    Если бы со времен появления Win32 API была бы функция, которая возвращала пару чисел (major version, minor version) и эта бы функция не менялась в том числе и по названию

    GetVersionEx доступна с 94-ого года.

    и по параметрам включая и NET Framework,

    Класс System.Version также доступен начиная с первой версии .NET

    то можно было бы говорить, что разработчики не умеют проверять версию, а так чистой воды design bug от Microsoft

    :-) Функцию проще чем GetVersionEx еще надо поискать. Если она слишком сложна, то лучше в программирование и не лезть.

    я своих программах никогда версию не проверяю ибо слишком изменчива эта процедура

    Можете привести пример изменчивости?

  9. March 27th, 2009 at 08:33 | #9

    C# программист :
    Просто ты в основном писал более сложные вещи и тут такое простое…

    А я что вижу, о том и пою. :-) Вот сейчас я ковыряюсь в ошибках совместимости Windows 7 и сторонних программ. И у меня складывается впечатление, что такие простые вещи не знает 90% разработчиков и 95% пользователей.

  10. Alver
    March 27th, 2009 at 09:09 | #10

    Привет. Извини, я не по теме поста. Как я понимаю – у тебя хорошее понимание 32- и 64-битной Windows. У меня проблема при работе с функцией CreateRemoteThread. Есть 32-битное приложение и 32-битная dll. Инджектим одно в другое. На WinXP 32-бита всё работает нормально. Всё тоже самое (32-х битные длл и приложение) на WinXP 64-бита – не срабатывает CreateRemoteThread, возвращает ошибку Access denied.
    Где искать проблему?

    Есть предположение, что проблема из-за 32-х битности. каждое приложение работает в некоторой песочнице. И инжектор (отдельное приложение) не может код вставить из-за недоступности другого 32-х битного приложения.
    Очень бы помогло несколько ссылок по работе 32-х битных приложений на 64-битных платформах.

    заранее спасибо :)

  11. March 27th, 2009 at 10:26 | #11

    Я думаю, что программисты знают, просто относятся к своей работе спустя рукава, поэтому и происходят эти проблемы. Вот примеры правильной проверки версии ОС нужно приводить постоянно. Неужели так сложно сравнивать номер версии на больше или равно, а не просто равно. Если уж и сравниваете только на равенство, то и в документации нужно писать, что программа предназначена строго для определенной версии Windows и в будущем 100% работать не будет.

  12. saelyb
    March 30th, 2009 at 10:35 | #12

    > nl_2010_pro
    NetLimiter? Так дело не только в версии ОС, видимо, они выпустили бетку для Win7 отдельно.

    Сам не проверял, правда, а у Вас 2010 заработал на Win7?

  13. March 30th, 2009 at 11:29 | #13

    saelyb :
    > nl_2010_pro
    NetLimiter? Так дело не только в версии ОС, видимо, они выпустили бетку для Win7 отдельно.

    В 2010 есть баг в драйвере, который на Win7 Beta проявляется.

    Сам не проверял, правда, а у Вас 2010 заработал на Win7?

    На Win7 RC заработал, но баг никуда не делся. В любой момент может рвануть.

  14. April 2nd, 2009 at 20:43 | #14

    Alver :
    У меня проблема при работе с функцией CreateRemoteThread.

    Если кому интересною. Разобрались с автором комментария offline. Описателю, передаваемому в CreateRemoteThread не хватало прав:

    The handle must have the PROCESS_CREATE_THREAD, PROCESS_QUERY_INFORMATION, PROCESS_VM_OPERATION, PROCESS_VM_WRITE, and PROCESS_VM_READ access rights, and may fail without these rights on certain platforms.

Comments are closed.