Win32: предложения по тестированию приложения против развертывания - PullRequest
4 голосов
/ 10 ноября 2009

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

Другими словами: приложение, которое не удалось на Windows XP , будет работать на Windows Vista .

Эти исправления ошибок, предоставляемые ОС, можно отключить, добавив раздел в манифест приложения , заявив, что приложение должно запускаться asInvoker:

<!-- Disable Windows Vista standard user compatability heuristics -->
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
   <security>
      <requestedPrivileges>
         <requestedExecutionLevel level="asInvoker"/>
      </requestedPrivileges>
   </security>
</trustInfo>

В идеале разработчик должен протестировать свое приложение, чтобы убедиться, что оно (без необходимости) не требует административных привилегий. Для того, чтобы я мог проверить это, мне нужно было бы продемонстрировать это asInvoker .

Но когда дело доходит до этого, я не собираюсь выпускать приложение для клиента, проявленное asInvoker . Если я что-то пропустил , я не хочу, чтобы на пользователя оказывали влияние. Я хочу Операционная система Microsoft, чтобы исправить мои ошибки. Проблема с этим решением:

  • я должен изменить manfiest перед выпуском
  • Я никогда не узнаю о вещах, которые я пропустил, потому что они просто работают в Windows Vista.

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

<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> 
   <application> 
      <!--The ID below indicates application support for Windows Vista -->
      <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> 
      <!--The ID below indicates application support for Windows 7 -->
      <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
   </application> 
</compatibility>

В случае поддерживаемых элементов OS операционная система заранее знает, для какой ОС вы были разработаны. Это поместит ваше приложение в контекст Windows Vista, если вы не скажете, что поддерживаете Windows 7:

alt text
(источник: msdn.com )

Это действие похоже на запуск приложения в некоторых Режимах совместимости , например ::1010 *

  • Windows Server 2008 (с пакетом обновления 1)
  • Windows Vista (с пакетом обновления 2)
  • Windows Vista (с пакетом обновления 1)
  • Windows Vista
  • Windows Server 2003 (пакет обновления 1)
  • Windows XP (с пакетом обновления 2)
  • Windows 2000
  • Windows NT 4.0 (с пакетом обновления 5)
  • Windows 98 / Windows Me
  • Windows 95

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

Пример совместимости показывает, что Windows 7 предоставит для приложения, работающего в контексте Windows Vista :

  • RPC будет использовать старый пул частных потоков, а не пул потоков ОС
  • Вы сможете заблокировать основной буфер отображения видео рабочего стола
  • вы сможете Blit в основной видеобуфер рабочего стола без указания окна отсечения
  • вы будете уязвимы для состояния гонки GetOverlappedResult (если вы зависели от него)
  • вы будете продолжать получать смягчение программы Compatibilty Assistant (PCA)

И еще раз, чтобы правильно протестировать мое приложение под Windows 7 , я должен добавить запись манифеста supportOS . Но, опять же, я не собираюсь отправить приложение с этим флагом, потому что я не хочу потерять преимущество этих шайб (например, PCA). И, опять же, если в приложении есть проблемы, которые были исправлены из-за того, что оно работало в контексте Vista : я никогда не узнаю об этом от наших клиентов - потому что приложение просто работает.


Мысли? Руководство? Лучшие практики?

Ответы [ 3 ]

2 голосов
/ 12 ноября 2009

Я не собираюсь выпускать приложение для клиента, заявленного как Invoker. Если я что-то пропустил, я не хочу, чтобы на пользователя оказывали влияние.

Я думаю, что это плохой подход. Мой совет - правильно с самого начала манифестировать и тестировать то, что вы развертываете.

Microsoft не собирается наклоняться назад для совместимости всех. Они собираются нацеливаться на наиболее распространенные, серьезные ошибки, допущенные крупнейшими поставщиками. Если вы пропустите какую-то небольшую проблему, вероятность того, что они предоставят прокладку в будущем, невелика.

Каждый раз, когда Microsoft добавляет прокладку совместимости, мы все платим свою цену. Есть API-интерфейсы, которые не работают так, как должны, потому что им приходилось обрабатывать некоторые случаи тупым путем, чтобы добиться совместимости с чужой ошибкой. Это означает длительные, болезненные сеансы отладки, это означает, что нужно просмотреть более длинную (или менее полную) документацию, и это означает небольшую неэффективность ОС для всех. Это также означает, что разработчики Windows тратят время на исправление ошибок других людей вместо того, чтобы улучшать ОС.

Иногда эти изменения совместимости являются большими молотками, которые наказывают разработчиков, которые делают это правильно. Многие приложения неправильно обрабатывают высокий DPI, поэтому - во имя совместимости - Vista предполагает, что ни одно приложение не обрабатывает его правильно (если они явно не заявляют об ином). В Vista применяется масштабирование пользовательского интерфейса. Приложения, не поддерживающие высокое разрешение, получают улучшенные (но неоптимальные) результаты. Приложения, которые обрабатывали , обрабатывают high_DPI и получают ухудшенные результаты. (И клиенты, которые использовали хорошие приложения, видят, что им становится хуже, когда они переходят на Vista и обвиняют Microsoft.) Разработчики, которые не платили свои налоги, получают помощь от Microsoft, остальные из нас (включая Microsoft) наказываются. Единственный способ избежать этого - каждый платит налоги.

В общем, Microsoft становится лучше, делая эти совместимости более целенаправленными (хотя Vista была довольно тупой). Тем не менее, для каждого из них есть небольшая цена.

Следуйте лучшим практикам во время разработки. Проверьте, что вы планируете развернуть. Если он сломается, Microsoft может исправить это за вас. В противном случае вам, возможно, придется выпустить обновление. Это лучше, чем всем, кто понес наказание, потому что некоторые разработчики поступили неправильно.

1 голос
/ 02 декабря 2009

AsInvoker - это правильный способ распространения вашего приложения !!!

Все, что говорит, запускается с учетными данными пользователя. В нем не написано «сделать что-то подлое» или «использовать права администратора».

Без этого манифеста вы заклеймите свое приложение как «Я не знаю UAC, поэтому, пожалуйста, предоставьте мне все хаки, которые вам нужны, чтобы я мог по-прежнему работать в любой системе, которая имеет UAC»

Но если ваше приложение не пытается делать только для администратора - и вы можете легко проверить это, просто войдя в систему как обычный пользователь и затем запустив свое приложение и наблюдая за сбоями, - тогда AsInvoker абсолютно прав.

Это может помочь вам разобраться с этим: Изучение программистом контроля учетных записей пользователей Vista

0 голосов
/ 11 ноября 2009

Насколько я понимаю, вместо предоставления файла манифеста вместе с вашим дистрибутивом, он также может быть напрямую связан с вашим EXE-файлом, добавив следующую команду в файл ресурсов вашего приложения: [1,2].

CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "YourApp.exe.manifest"

Отдельный файл манифеста в каталоге, содержащий файл EXE, может переопределить этот связанный манифест, но это зависит от клиента. Вы бы его не поставили.

Теперь компилятор ресурсов "RC" от Microsoft принимает директивы препроцессора, такие как #ifdef [3]. Это означает, что вы можете указать вашей Visual Studio две отдельные цели сборки, определяющие разные определения препроцессора, такие как TESTING и DEPLOYMENT.

Тогда нужно просто использовать директивы #ifdef для использования двух разных файлов манифеста для целей тестирования и сборки развертывания, и вы можете редактировать файлы манифеста по своему усмотрению. Решит ли это вашу проблему?

[1] http://msdn.microsoft.com/en-us/library/ms997646.aspx
[2] http://doc.ddart.net/xmlsdk/htm/sdk_dependencies_5wvi.htm
[3] http://msdn.microsoft.com/en-us/library/aa381033%28VS.85%29.aspx

...