Программируем для Windows 7. Проверка версии
При выходе новой версии операционной системы Windows возникает проблема совместимости, а также работоспособности новых программ на старых компьютерах. Например, в Windows 7 появились новые функциональные возможности типа JumpList. Если включите эту функцинальность в своих программах и передадите их клиенту, который работает еще под Windows XP, то ваши программы не зарабатают. А вы потеряете свой авторитет у заказчика. Поэтому, чтобы избежать подобных ситуаций, необходимо правильно подойти к этой проблеме.
Самый простой способ, который приходит в голову - это проверка версии Windows. Тут есть одна ловушка, в которую постоянно попадают программисты. Заключается она в том, что при проверке версии жестко задаются номера версий. Вот простой пример. Предположим, разработчик в свое время написал программу, когда пользователи переходили с Windows 98/2000 на Windows XP. Чтобы убедиться, что у пользователя установлена именно Windows XP, а не более старая версия, программист писал следующее:
static private bool IsOSSupported()
{
OperatingSystem os = Environment.OSVersion;
Version vs = os.Version;
if ((vs.Major == 5) && (vs.Minor == 1))
{
return true;
}
else
{
MessageBox.Show("Для работы необходима Windows XP.",
"Несовместимая версия ОС", MessageBoxButtons.OK,
MessageBoxIcon.Error);
return false;
}
}
На первый взгляд, код написан правильно. И программы прекрасно проходили проверку и запускались в Windows XP. Но прошло несколько лет, и Microsoft выпустила новые операционные системы Windows Vista, Windows Server 2003, Windows Server 2008, Windows 7. Что теперь произойдет с вашей программой? Правильно, она не запустится и пользователь увидит сообщение:

Чтобы избежать подобной ситуации, необходиомо внести изменения в код проверки версии. Например, так:
if ((vs.Major >= 5) && (vs.Minor >= 1))
Но, Microsoft не рекомендует проверять версию операционной системы для запуска программы, так как это не является надежным способом для проверки работоспособности программы. Не забывайте, что одна и та же операционная система может иметь несколько редакций - Начальная, Максимальная и так далее. Возможно, ваша программа использует какой-нибудь компонент, недоступный в установленной редакции Windows у пользователя.
Проверка наличия компонента вместо проверки версии
Более современными и правильным способом является проверка наличия нужного компонента Windows, вместо проверки версию ОС. В этом случае приложение сможет работать, даже если компонент был добавлен к более ранней версии ОС. Например, в Windows 7 появилась новая функция Windows API SetWaitableTimerEx.
Методика проверки выглядит следующим образом. Мы вызываем функцию SetWaitableTimerEx при помощи P/Invoke. Если эта функция отсутствует в библиотеке kernel32.dll, то вызов создает исключение EntryPointNotFoundException (приложения .NET Framework, вызывающие интерфейсы API Win32 посредством P/Invoke, должны обрабатывать исключения EntryPointNotFoundException и DllNotFoundException). В этом случае мы будем использовать более старую функцию SetWaitableTimer. Это позволит приложению работать с ограниченной функциональностью в более старых версиях Windows, не имеющих этой функции, вместо того чтобы вообще не работать.
public void Start(long dueTime, int period)
{
ReasonContext rc = new ReasonContext();
rc.Version = 0;
rc.Flags = 1;
rc.SimpleReasonString = "MyTimer";
try
{
// Используйте версию Windows 7, если возможно
if (!Win32.SetWaitableTimerEx(_hTimer, ref dueTime, period,
IntPtr.Zero, IntPtr.Zero, ref rc, 5000))
throw new Win32Exception(Marshal.GetLastWin32Error(),
"Сбой SetWaitableTimerEx.");
IsCoalescingtimer = true;
}
catch (EntryPointNotFoundException)
{
IsCoalescingtimer = false;
// В противном случае используем предыдущую версию
if (!Win32.SetWaitableTimer(_hTimer, ref dueTime, period,
IntPtr.Zero, IntPtr.Zero, false))
throw new Win32Exception(Marshal.GetLastWin32Error(),
"Сбой SetWaitableTimer.");
}
_waiterThread = new Thread(WaiterThreadProc);
_waiterThread.Name = "Поток объекта, ожидающего ответа, для WaitableTimer";
_waiterThread.Start();
}
Также рекомендую вам скачать учебный курс по Windows 7 и изучить примеры, входящие в данный курс (папка ..\Windows7TrainingKit\Labs\Version Checking - Managed).
В заключение, хочется сказать, что неправильная проверка версий является распространенной ошибкой не только у программистов, но и у веб-мастеров, которые проверяют в сценариях JavaScript версию Internet Explorer. После выхода IE7 и IE8 многие сценарии перестали работать именно из-за этой ошибки.
Реклама
квартиры в городе люберцы ;Продам офис тверская. Продажа офиса м Тверская.;Сток-Центр Диванов: диван аккордеон.; ораторское искусство тренинги ; диван техас

