четверг, 3 апреля 2014 г.

Проблемы, возникающие при подготовке Windows-программ для распространения. Часть 3. Интеграция с инсталлятором

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

Способы активации

Способы активации, которые должен, в общем случае, поддерживать установщик, такие же, как и при активации непосредственно из приложения, с небольшим дополнением:

  • Активировать при помощи серийного номера
  • Активировать при помощи ключевого файла лицензии
  • Активировать пробную версию
  • Активировать позже
  • Уже активировано на данном компьютере

Опция "уже активировано на данном компьютере" по своему действию аналогична опции "активировать позже" (не производит никаких действий), но ее наличие помогает избежать вопросов при повторной установке (при обновлении ПО): "что делать, если приложение уже было активировано на моем комьютере?".

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

Типы установки

Типы установки приложения, как и типы активации, описанные ранее, подразумевают возможность установить приложение как для всех пользователей, так и только для текущего пользователя.

Иногда, чтобы упростить себе работу, создатель инсталляционного пакета просто выводит сообщение через функцию MessageBox - "установить приложение для всех пользователей? Да/Нет.", но это не самый лучший и понятный для пользователя способ. Гораздо более правильно создать отдельную страницу мастера установки, на следует которой предоставить возможность выбора из двух вариантов, выбираемых при помощи радиокнопок. Такой способ выбора будет гораздо более нагляден и понятен пользователю.


вторник, 1 апреля 2014 г.

Проблемы, возникающие при подготовке Windows-программ для распространения. Часть 2. Диалог активации

Если используемый вами протектор имеет встроенные функции отображения диалога(ов) активации, значит, эта печаль обошла вас стороной (если, конечно, вас всё устраивает в этих диалогах). API VMProtect не не предоставляет подобных функций, поэтому диалог активации нам пришлось делать самим.

Для того, чтобы диалог активации можно было легко перенастроить под потребности любого приложения, он бы спроектирован таким образом, чтобы поддерживать все возможные типы и способы активации.

Способы активации

Ориентируясь на API VMProtect и на собственные потребности, были сформулированы требования к диалогу активации. Так, от диалога активации требуется уметь активировать приложение следующими способами:

  • Активировать при помощи серийного номера
  • Активировать при помощи ключевого файла лицензии
  • Активировать пробную версию

Если приложение позволяет работу в режиме без активации (в том числе и без активации пробной лицензии), необходимо также добавить опцию "активировать позже".

Если приложение позволяет производить offline активацию (в API VMProtect для этого есть соответствующие функции), то необходимо предусмотреть возможность отображения данных для offline активации.

Ввод серийного номера

Поле ввода серийного номера принято отображать как несколько полей ввода, с автоматическим переходом между ними при заполнении каждого из них.

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

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

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

Типы активации

Под типами активации подразумевается возможность активировать приложение:

  • только для текущего пользователя
  • для всех пользователей данного компьютера

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

Повышение привелегий

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

Кастомизация внешнего вида диалога

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

Также не стоит прибивать гвоздями расположение кнопок "Ok", "Отмена", "Повысить привилегии" - желательно предусмотреть возможность их расположения слева, справа или по центру; в нижней части диалога или выровненными по верхнему краю.


Проблемы, возникающие при подготовке Windows-программ для распространения. Часть 1. Хранение данных лицензии на компьютере пользователя и виртуализация Windows

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

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

Виртуализация реестра и файловой системы

Для того, чтобы старые программы, привыкшие работать под Windows 2000 и Windows XP могли без изменений работать под системами Windows Vista+, приложению даются права на запись в общую ветвь реестра - HKEY_LOCAL_MACHINE\Software, а также на запись в некоторые части файловой системы, но реальная запись происходит в ветку HKEY_LOCAL_MACHINE\_Classes\VirtualStore\Machine\Software. Аналогичная ситуация имеет место быть и для файловой системы.

Статус виртуализации определяется следующими параметрами (тут могут быть неточности):

  1. Виртуализация включена, когда приложение запущено с обычными правами и
    • отсутствует манифест приложения;
    • в манифесте не указано, что следует отключить виртуализацию. Такие манифесты добавляют, как минимум, MSVC2005 и MSVC2008.
  2. Виртуализация выключена
    • в манифесте указано отключение виртуализации;
    • когда приложение запущено с повышенными правами.

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

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

Управление вируализацией

Для определения текущего уровня привилегий пользователя, определения и установки статуса виртуализации есть новые функции (вернее, как новые, так и старые с новыми значениями параметров) WinAPI, но их использование не слишком просто. К тому же, если хочется поддерживать совместимость с версиями системы Windows 2000 и Windows XP, некоторые функции придется загружать динамически.

Виртуализация x86/x64

Это еще одна "ось" виртуализации - по умолчанию, данные для x86 приложений в системах x64 хранятся отдельно. Если требуется, чтобы x86 и x64 версии приложения использовали одни и те же данные, эту виртуализацию следует отключить. К счастью, это делается простой установкой одного из новых флагов функции открытия реестра.