Програмуємо для Windows 7
Найпростіший спосіб, який спадає на думку - це перевірка версії Windows. Тут є одна пастка, до якої постійно потрапляють програмісти. Полягає вона в тому, що під час перевірки версії жорстко задаються номери версій. Ось простий приклад. Припустимо, розробник свого часу написав програму, коли юзери переходили з Windows 98/2000 на Windows XP. Щоб переконатися, що у користувача встановлена саме Windows XP, а не старіша версія, програміст писав наступне:
На перший погляд код написаний правильно. І програми чудово проходили перевірку та запускалися у Windows XP. Але минуло кілька років і Microsoft випустила нові операційні системи Windows Vista, Windows Server 2003, Windows Server 2008, Windows 7. Що тепер станеться з вашою програмою? Правильно, вона не запуститься і користувач побачить повідомлення:
Щоб уникнути подібної ситуації, необхідно внести зміни до коду перевірки версії. Наприклад, так:
Перевірка наявності компонента замість перевірки версії
Більш сучасним і правильним способом є перевірка наявності потрібного компонента Windows замість перевірки версію ОС. У цьому випадку програма зможе працювати, навіть якщо компонент був доданий до більш ранньої версії ОС. Наприклад, у Windows 7 з'явилася нова функція Windows APISetWaitableTimerEx.
Методика перевірки виглядає так. Ми викликаємо функціюSetWaitableTimerEx за допомогою P/Invoke. Якщо ця функція відсутня в бібліотеці kernel32.dll, виклик створює винятокEntryPointNotFoundException (додатки .NET Framework, що викликають інтерфейси API Win32 за допомогою P/Invoke, повинні обробляти винятки EntryPointNotFoundException і DllNotFoundException В цьомуЯкщо ми будемо використовувати більш стару функціюSetWaitableTimer. Це дозволить застосунку працювати з обмеженою функціональністю у більш старих версіях Windows, що не мають цієї функції, замість того, щоб взагалі не працювати.
Також рекомендую вам завантажити навчальний курс по Windows 7 і вивчити приклади, що входять до цього курсу (папка ..\Windows7TrainingKit\Labs\Version Checking - Managed).