Windows 7

Рекомендации по обеспечению совместимости приложений. Часть 1

Алексей Федоров

Версия операционной системы

Новая версия Internet Explorer

Отсутствие компонента Windows Mail

Использование библиотек (Library)

Отсутствие сервиса Windows Registry Reflection

Отсутствие драйвера wpdusb.sys для Windows Portable Devices

Новые двоичные компоненты операционной системы

Работа Internet Explorer в режиме DEP

Изменения в MSMQ

Технология Switchback

 

В новой, седьмой версии клиентской операционной системы Microsoft Windows продолжено развитие технологий, появившихся в Windows Vista. Для того чтобы приложения могли корректно работать под управлением Windows 7, помимо рекомендаций, приведенных в данной статье, следует обратить внимание на ряд изменений, которые произошли в операционной системе. К таким изменениям относятся:

  • версия операционной системы;
  • новая версия Internet Explorer;
  • отсутствие компонента Windows Mail;
  • использование библиотек;
  • отсутствие сервиса Windows Registry Reflection;
  • отсутствие драйвера WPDUSB.SYS для Windows Portable Devices;
  • новые двоичные компоненты операционной системы;
  • работа Internet Explorer в режиме DEP;
  • изменения в MSMQ.

Рассмотрим каждое из перечисленных изменений и возможные проблемы более подробно.

Версия операционной системы

Версия операционной системы Windows 7 и Windows Server R2 — 6.1. Функция GetVersionEx() возвращает именно этот номер (поле dwMajorVersion содержит 6, а поле dwMinorVersion — 1). Все рассмотренные выше рекомендации по правильной проверке номера версии применимы в случае выполнения кода под управлением и Windows 7, и Windows Server R2.

В общем случае проверка версии операционной системы должна производиться следующим образом (приведен пример на C#):

static private bool IsOSSupported()

{

 OperatingSystem os = Environment.OSVersion;

 Version vs = os.Version;

 if ((vs.Major == 5) && (vs.Minor &= 1) || vs.Major >= 6 )

 {

  return true;

 }

Вот пример проверки версии операционной системы на неуправляемом коде:

#include <windows.h>

#include <stdio.h>

void main()

{

    OSVERSIONINFO osvi;

    BOOL bIsWindowsXPorLater;

    ZeroMemory(&osvi, sizeof(OSVERSIONINFO));

    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);

    GetVersionEx(&osvi);

    bIsWindowsXPorLater = 

       ( (osvi.dwMajorVersion > 5) ||

       ( (osvi.dwMajorVersion == 5) && (osvi.dwMinorVersion >= 1) ));

    if(bIsWindowsXPorLater)

        printf(«The system meets the requirements.\n»);

    else printf(«The system does not meet the requirements.\n»);

}

Рекомендуется проверять не версию операционной системы, а ее издания (и наличие соответствующих компонентов), используя функции GetSystemMetrics(), VerifyVersionInfo() или SystemParametersInfo(). Для проверки наличия в текущей версии операционной системы какого-либо программного интерфейса следует применять функцию LoadLibrary() для загрузки соответствующей динамической библиотеки и функцию GetProcAddress() для определения адреса интересующей функции. Если функция не найдена, GetProcAddress() возвращает код ошибки ERROR_CALL_NOT_IMPLEMENTED.

Подробнее об этих функциях можно прочесть по адресам:

Новая версия Internet Explorer

В новой версии операционной системы появится и новая версия Internet Explorer — Internet Explorer 8, а следовательно, строка User Agent, которую веб-серверы используют для определения версии браузера, будет включать новые данные. Вот как выглядит строка User Agent для Internet Explorer 8, работающего в «родном» режиме:

Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)

В режиме совместимости с Internet Explorer 7 строка User Agent выглядит так:

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)

Обратите внимание на то, что элемент Trident/4.0 позволяет определить, что даже в режиме совместимости браузером является Internet Explorer 8.

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

Режим совместимости можно указать следующим образом (на уровне страницы):

<html>

<head>

 <!-- Mimic Internet Explorer 7 -->

 <meta http-equiv=”X-UA-Compatible”  content=”IE=EmulateIE7” />

 <title>My Web Page</title>

</head>

<body>

 <p>Content goes here.</p>

</body>

</html>

или на уровне HTTP-протокола (для ASP .NET):

<?xml version=»1.0» encoding=»utf-8»?>

<configuration>

  <system.webServer>

    <httpProtocol>

      <customHeaders>

        <clear />

        <add name=”X-UA-Compatible” value=”IE=EmulateIE7” />

      </customHeaders>

    </httpProtocol>

  </system.webServer>

В коде режим совместимости можно определить так:

engine= null;

if(window.navigator.appName == «Microsoft Internet Explorer»)

{

   // This is an IE browser. What mode is theengine in?

   if (document.documentMode) // IE8

      engine = document.documentMode;

  else // IE 5-7

  {

      engine = 5; // Assume quirks mode unless proven otherwise

      if (document.compatMode)

      {

         if (document.compatMode ==«CSS1Compat»)

            engine = 7; // standards mode

      }

  }

//the engine variable now contains the document compatibility mode.

}

Дополнительная информация:

Отсутствие компонента Windows Mail

В Windows 7 компонент операционной системы Windows Mail (Outlook Express) заменен на Windows Live Mail — при необходимости можно использовать и любой другой почтовый клиент стороннего производителя (рис. 1). С точки зрения программных интерфейсов отсутствие Windows Mail влечет за собой отмену действия интерфейса CoStartOutlookExpress — все остальные программные интерфейсы продолжают функционировать.

 

Рисунок

Рис. 1. Сообщение об отсутствии WinMail

Отсутствие этого компонента сказывается следующим образом:

  • все точки входа для Windows Mail и Contacts (например, меню Start, ссылки, созданные пользователями, команда Start > Run и т.п.) удалены и недоступны;
  • все динамически загружаемые библиотеки (dll) по-прежнему входят в состав операционной системы;
  • программные интерфейсы, описанные в документации и не помеченные как deprecated, продолжают работать так же, как и в Windows Vista;
  • программные интерфейсы, вызывающие Windows Mail, не выполняют никаких действий;
  • обработчики протоколов (mailto, ldap, news, snews, nntp) не ассоциированы с Windows Mail или Contacts. При попытке запуска пользователи перенаправляются на страницу настроек, где им предлагается ассоциировать эти протоколы с установленными почтовыми клиентами (Programs > Default Programs > Set Associations);
  • ассоциации с файлами (*.eml, *.nws, *.contact, *.group, *.wab, *.p7c, *.vcf) либо не созданы, либо направлены в программу Windows Contacts. При попытке открытия файлов с указанными расширениями пользователям предлагается применять другие приложения;
  • функции предварительного просмотра файлов удалены, ссылки на рабочем столе отключены, механизмы поиска по файлам не функционируют.

Для исправления возможных ошибок необходимо установить Windows Live Mail или другую почтовую программу, которая позволит читать файлы с расширениями *.eml и *.nws. В приложениях не следует использовать функции Windows Mail UI, а при создании новых версий приложений нужно вообще отказаться от применения функций Windows Mail.

Использование библиотек (Library)

Новый интерфейсный элемент — Library — представляет собой виртуальное объединение папок и с точки зрения операционной системы выглядит как файл (и как папка для пользователя). В случае применения функций IFileDialog->GetFolder() и IFileDialog->GetFilename() для работы с библиотеками функция GetFolder() возвращает имя файла, а не папки. Для исправления этой ситуации следует использовать функцию IFileDialog->GetResult().

Более подробно о библиотеках см. документацию по интерфейсу IShellLibrary в MSDN или Windows SDK по адресу: http://msdn.microsoft.com/en-us/library/dd391719(VS.85).aspx. Данный интерфейс содержит методы для создания библиотек и управления ими. Для работы с Library из управляемого кода следует применять библиотеку Windows Bridge, которая входит в состав Windows SDK или распространяется отдельно на сайте MSDN Code Gallery — http://code.msdn.microsoft.com/VistaBridge.

Отсутствие сервиса Windows Registry Reflection

Процесс, известный под названием Windows Registry Reflection, копирует ключи реестра и их значения между двумя представлениями реестра и поддерживает синхронизацию между ними. В предыдущих версиях Windows 64 этот процесс создавал копии подмножества перенаправленных ключей реестра для 32- и 64-разрядных представлений. Начиная с версии Windows 7 механизмы синхронизации реестра выключены, поскольку единственным реальным потребителем этой функциональности была подсистема COM, которая в Windows 7 была обновлена таким образом, чтобы не зависеть от перенаправлений ключей реестра.

В ряде случаев приложения могут столкнуться с несоответствием данных в 32- и 64-битных представлениях реестра. К ключам реестра, в которых это может проявляться, относятся:

  • HKEY_LOCAL_MACHINE\Software\Classes;
  • HKEY_LOCAL_MACHINE\Software\Microsoft\COM3;
  • HKEY_LOCAL_MACHINE\Software\Microsoft\EventSystem;
  • HKEY_LOCAL_MACHINE\Software\Microsoft\Ole;
  • HKEY_LOCAL_MACHINE\Software\Microsoft\Rpc;
  • HKEY_USERS\*\Software\Classes;
  • HKEY_USERS\*_Classes.

Обратите внимание, что в Windows 7, за исключением приведенных ниже ключей реестра, все ключи объединены в единое пространство, доступное как из 32-, так и из 64-разрядных версий приложений:

  • HKEY_LOCAL_MACHINE\Software\Classes\CLSID;
  • HKEY_LOCAL_MACHINE\Software\Classes\Interface.

Для исправления возможных несовместимостей следует воспользоваться одним из следующих подходов:

  • применять только неперенаправленные ключи;
  • использовать опцию KEY_WOW64_64KEY для доступа к реестру — таким образом, и 32-, и 64-разрядные приложения будут применять только 64-разрядные ключи;
  • использовать данные только из рекомендованных ключей реестра.

Дополнительная информация:

Отсутствие драйвера wpdusb.sys для Windows Portable Devices

В Windows 7 на смену драйверу wpdusb.sys пришел драйвер winusb.sys. Те приложения, которые применяли программные интерфейсы Windows Portable Devices (WPD), продолжают работать без каких-либо изменений. Проблемы могут возникнуть при использовании в коде недокументированных кодов IOCTL — в этом случае рекомендуется воспользоваться документированными функциями Windows Portable Devices (WPD).

Дополнительная информация:

Новые двоичные компоненты операционной системы

В процессе разработки новой версии операционной системы была начата работа по модернизации и компонентизации ядра операционной системы (проект MinWin). Задача MinWin — обеспечить минимальный набор компонентов, требуемых для загрузки операционной системы и доступа к сети. Такая версия ядра, реализованная в библиотеке KernelBase.dll и ряде других компонентов, отвечает за поддержку файловой системы NT, загрузку драйверов, стека TCP/IP, базового веб-сервера и занимает 25-30 Мбайт на диске.

В Windows 7 ядро операционной системы не полностью заменено на MinWin, но, тем не менее, ряд компонентов ОС изменился. Например, функциональность из kernel32.dll и advapi32.dll перенесена в библиотеку kernelbase.dll и экспортируемые функции перенаправляются в соответствующие библиотеки с применением механизмов виртуализации. Такие изменения могут повлиять на работоспособность приложений, применяющих недокументированные структуры, программные интерфейсы и т.п. Единственный способ обеспечить совместимость — это использовать только документированные функции и структуры, описанные в MSDN и документации, входящей в состав Windows SDK.

Для того чтобы увидеть изменения на уровне ядра операционной системы, воспользуемся утилитой Dependency Walker (http://www.dependencywalker.com/), которая выполняет анализ исполняемых файлов и библиотек и показывает зависимости от компонентов операционной системы и файлов сторонних производителей.

В качестве примера выберем утилиту Notepad.exe, которая располагается в папке %windir%. Сначала запустим утилиту в Windows Vista и выберем модуль c:\windows\system32\KERNEL32.DLL. Убедимся в том, что данный модуль зависит от модуля c:\windows\system32\NTDLL.DLL. Взгляд на модуль c:\windows\system32\ADVAPI32.DLL показывает, что он зависит от c:\windows\system32\KERNEL32.DLL, c:\windows\system32\NTDLL.DLL и ряда других модулей. Результат нашего исследования показан на рис. 2.

 

Рисунок

Рис. 2. Работа Dependency Walker в Windows Vista

Запуск этой же утилиты под управлением Windows 7 покажет совсем иную картину — модули KERNEL32.DLL и ADVAPI32.DLL на самом деле состоят из набора подмодулей (рис. 3). Эти подмодули называются ApiSet Stub DLL и содержат подмножества функций из библиотеки KERNEL32.DLL, что делает ядро ОС более модульным.

 

Рисунок

Рис. 3. Работа Dependency Walker в Windows 7

Работа Internet Explorer в режиме DEP

В новой версии Internet Explorer механизм Data Execution Prevention (NX) по умолчанию включен. В Windows Vista для включения этого механизма требовался запуск Internet Explorer от имени учетной записи администратора. Применение механизмов Data Execution Prevention повышает безопасность Internet Explorer, запрещая выполнение кода в области данных (более подробно об этом см. «Технологии защиты приложений в Windows Vista, Windows 7 и Windows Server 2008/R2» в приложении), но может повлиять на выполнение ряда модулей расширения. Для исправления данной ситуации при создании модулей расширения следует использовать версии библиотек, совместимые с DEP (например, ATL, подробности см. в статье из базы знаний «Applications Using Older ATL Components May Experience Conflicts With DEP», http://support.microsoft.com/kb/948468) и при сборке применять опцию /NXCOMPAT.

Дополнительно о DEP можно прочесть по адресам:

Изменения в MSMQ

На уровне Microsoft Message Queing (MSMQ) произошел ряд изменений, которые сводятся к использованию по умолчанию алгоритма хеширования SHA-2 (который не поддерживается для Windows Server 2003 и более ранних версий операционной системы) — изменение этого алгоритма возможно редактированием соответствующих значений реестра.

Технология Switchback

В манифесте приложения появилась новая секция — CompatibilityInfo, которая позволяет указать, для какой версии операционной системы предназначено то или иное приложение. Данная секция позволяет, например, применять компоненты от предыдущих версий операционной системы (например, Common Controls), которые располагаются в папке %windir%\winsxs.

Правила использования секции CompatibilityInfo достаточно простые — если ее нет в манифесте, подразумевается совместимость с Windows Vista и задействуется ряд функций системы: GetOverlappedResult(), ReadFileEx(), обработчик исключений RPC, управление пулом потоков, режим совместимости DWM и т.п.

Расширенная версия манифеста приложения выглядит так:

<?xmlversion=»1.0» encoding=»UTF-8» standalone=»yes»?>

<assemblyxmlns=”urn:schemas-microsoft-com:asm.v1” manifestVersion=”1.0”>

  <compatibility xmlns=”urn:schemas-microsoft-com:compatibility.v1”>

    <application>

      <!-- Windows 7 supported -->

      <supportedOS Id=”{35138b9a-5d96-4fbd-8e2d-a2440225f93a}”/>

    </application>

  </compatibility>

</assembly>

GUID для Windows Vista имеет значение {e2011457-1546-43c5-a5fe-008deee3d3f0}, для Windows 7 — {35138b9a-5d96-4fbd-8e2d-a2440225f93a}.

***

Во второй части данной статьи мы обсудим полезные утилиты для тестирования приложений и сбора информации об их работе, а также программу сертификации приложений на совместимость с Windows 7.

 

В начало В начало

КомпьютерПресс 7'2009

1999 1 2 3 4 5 6 7 8 9 10 11 12
2000 1 2 3 4 5 6 7 8 9 10 11 12
2001 1 2 3 4 5 6 7 8 9 10 11 12
2002 1 2 3 4 5 6 7 8 9 10 11 12
2003 1 2 3 4 5 6 7 8 9 10 11 12
2004 1 2 3 4 5 6 7 8 9 10 11 12
2005 1 2 3 4 5 6 7 8 9 10 11 12
2006 1 2 3 4 5 6 7 8 9 10 11 12
2007 1 2 3 4 5 6 7 8 9 10 11 12
2008 1 2 3 4 5 6 7 8 9 10 11 12
2009 1 2 3 4 5 6 7 8 9 10 11 12
2010 1 2 3 4 5 6 7 8 9 10 11 12
2011 1 2 3 4 5 6 7 8 9 10 11 12
2012 1 2 3 4 5 6 7 8 9 10 11 12
2013 1 2 3 4 5 6 7 8 9 10 11 12
Популярные статьи
КомпьютерПресс использует