#delphi #delphi-xe #versioninfo
#delphi #delphi-xe #versioninfo
Вопрос:
Я использую параметры проекта / Version для управления информацией о версии (формат N.N.N.N.).
В любом случае внутри моего проекта я дублирую эту информацию.
Итак, если в параметрах проекта я работаю над выпуском 2.4.3.178 внутри моего приложения, у меня есть 4 целочисленных переменных, которые содержат 4 числа.
Я установил их вручную
Major := 2;
Minor := 4;
Release := 3;
Build := 178;
Причина этого проста: у меня есть лицензирование, основанное на номере версии. Таким образом, если пользователь покупает версию «2.4», ему не разрешается обновляться до версии «3.0».
Но если я полагаюсь на информацию о версии проекта, пользователь может (с помощью инструментов взлома ресурсов) изменить информацию о версии и, следовательно, «активировать» продукт.
Пользователь не может изменить 4 переменные таким же образом (по крайней мере, не так легко).
Это работает, но заставляет меня дублировать информацию.
Не могли бы вы предложить лучший подход?
В противном случае: есть ли способ записать информацию о версии, используя данные, которые я записываю в эти 4 переменные. Что-то вроде событий Post Build, но как мне передать данные в события post build?
Комментарии:
1. Что вы хотите? Защита от несанкционированного доступа? Или автоматически? Или удобно? Все эти вещи? Сложная задача.
Ответ №1:
Вам потребуется событие предварительной сборки, а не событие последующей сборки, поскольку вы хотели бы создать файл .res перед связыванием.
Я делаю что-то очень похожее с простым скриптом Perl, который считывает включаемый файл (.inc), содержащий постоянные объявления номеров версий. Я читаю их с помощью регулярного выражения, а затем создаю свой rc-файл, который передаю в brcc32. Все это вызывается как действие предварительной сборки.
Комментарии:
1. Вы также можете сделать это в событии после сборки, заменив ресурс в exe, но событие предварительной сборки кажется логичным вариантом. Поскольку пользователь использует Delphi-XE, у него есть Final BUilder, он может использовать его и INI-файл для автоматизации сборки, пропуская Perl-скрипт. 1
2. Немного скрипта на perl или python, немного асимметричного шифрования и кодировки mime64 — и у вас может получиться респектабельная система предотвращения подмены версий.
Ответ №2:
Поскольку вы работаете на Delphi-XE и у вас есть Final Builder, почему бы вам не использовать его с пользой и не создать на его основе свою «окончательную» сборку? Это может дать очень хорошее решение проблемы номера версии и намного больше.
Вот как я бы это сделал.
- Настройте небольшой INI-файл, который содержит соответствующие части информации о версии.
- При необходимости создайте небольшое приложение Delphi forms, которое считывает номер версии из INI-файлов и дает вам возможность изменить его. Когда изменения сохраняются в INI-файле, приложение delphi должно автоматически сгенерировать небольшой PAS-файл Delphi, который определяет константы!
- Создайте проект FinalBuilder, который выполняет следующее:
- Вызывает ваш Delphi exe для настройки номера версии. Вы будете отвечать за изменение всего, что необходимо изменить, и это, вероятно, уместно, поскольку ваша схема лицензирования зависит от информации о версии.
- Настройте несколько переменных проекта для хранения номеров информации о версии
- Добавьте действия «Прочитать INI-файл» для чтения информации о версии из ini-файлов в переменные вашего проекта.
- (необязательно) Создайте проект модульного тестирования, если он у вас есть.
- (необязательно) Вызовите проект модульного тестирования.
- Добавьте действие «построить проект Delphi», настройте его на сборку вашего проекта с использованием любых необходимых вам опций. Добавьте небольшой скрипт «До», чтобы сопоставить номера информации о версии с тем, что у вас есть в переменных проекта, которые вы только что прочитали из INI-файла.
- (необязательно) создавайте пакеты установки с помощью любого используемого вами инструмента.
- (необязательно) загрузите эти пакеты установки на веб-сайт.
Другими словами, воспользуйтесь возможностью начать использовать Final Builder.
Комментарии:
1. Это хорошие моменты, но OP, похоже, больше интересуется защитой от несанкционированного доступа, чем автоматизацией сборки.
Ответ №3:
Перенос номеров версий в код также легко обойти.
Один из способов передачи информации — сгенерировать файл version.rc программно (вы сами пишете крошечный инструмент сборки, используя delphi или язык сценариев по вашему выбору) и связать ресурсы с программой, вместо использования встроенной функции информации о версии.
Ваш вопрос, по-видимому, в основном заключается в том, чтобы запретить пользователю изменять (легко) номер версии после того, как вы его определили.
Итак, я предлагаю зашифровать номер версии и использовать зашифрованную версию вместо версии в структуре VersionInfo.
Я использовал DCPCRYPT для подобных вещей. Но если вы надеетесь быть защищенным от хакеров, позвольте мне просто сказать следующее; все, что вы можете сделать, хакеры могут отменить. Если вы хотите быть более защищенным, вам также потребуется защита от несанкционированного доступа ко всему вашему приложению. Существуют коммерческие решения для защиты от несанкционированного доступа, но ни одно из них не работает потрясающе «из коробки» с Delphi.