Как использовать информацию о версии проекта в приложении Delphi? - PullRequest
3 голосов
/ 05 апреля 2011

Я использую параметры проекта / версию для управления информацией о версии (формат N.N.N.N).

В любом случае, внутри моего проекта я дублирую эту информацию.

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

Я их вручную установил

Major := 2;
Minor := 4;
Release := 3;
Build := 178;

Причина этого проста: у меня лицензирование на основе номера версии. Поэтому, если пользователь покупает выпуск «2.4», ему не разрешено обновляться до версии «3.0».

Но если я полагаюсь на информацию о версии проекта, пользователь может (с помощью инструментов Resource Hacker) изменить информацию о версии и, следовательно, «активировать» продукт.

Пользователь не может изменять 4 переменные одинаково (по крайней мере, не так легко).

Это работает, но заставляет меня дублировать информацию.

Не могли бы вы предложить лучший подход?

Иначе сказал: есть ли способ записать информацию о версии, используя данные, которые я записываю в эти 4 переменные. Что-то похожее на события Post Build, но как передать данные в события Post Build?

Ответы [ 3 ]

3 голосов
/ 05 апреля 2011

Вам нужно событие перед сборкой, а не событие после сборки, поскольку вы хотите создать файл .res перед компоновкой.

Я делаю нечто очень похожее с простым скриптом Perlкоторый читает включаемый файл (.inc), содержащий константные объявления номеров версий.Я читаю их с помощью регулярных выражений, а затем создаю свой файл .rc, который я передаю в brcc32.Все это вызывается как действие перед сборкой.

2 голосов
/ 05 апреля 2011

Поскольку вы работаете в Delphi-XE и у вас есть Final Builder, почему бы вам не использовать его на должном уровне и не сделать свою "окончательную" сборку?Это может дать очень хорошее решение проблемы с номером версии и может сделать лот больше.

Вот как я бы это сделал.

  • Установитьсоздайте небольшой INI-файл, в котором содержатся соответствующие части информации о версии.
  • При необходимости создайте небольшое приложение Delphi для форм, которое считывает номер версии из INI-файлов и дает вам возможность изменить его.Когда изменения сохраняются в INI-файле, приложение delphi должно автоматически создать небольшой PAS-файл Delphi, который определяет константы!
  • Создать проект FinalBuilder, который выполняет следующие действия:
    • Вызывает ваш Delphi exeустановить номер версии.Вы будете отвечать за изменение того, что нужно изменить, и это, вероятно, уместно, поскольку ваша схема лицензирования зависит от информации о версии.
    • Установите несколько переменных проекта для хранения номеров информации о версии
    • Добавьте действия «Чтение INI-файла» для чтения информации о версии из INI-файлов в переменные вашего проекта.
    • (необязательно) Создайте проект модульного теста, если он у вас есть.
    • (необязательно)Вызовите проект модульного теста.
    • Добавьте действие «build Delphi project», настройте его для сборки вашего проекта с использованием любых необходимых вам параметров.Добавьте небольшой сценарий «До», чтобы настроить номера информации о версии на то, что вы получили в переменных проекта, которые вы только что прочитали из INI-файла.
    • (необязательно), создайте установочные пакеты, используя любой инструмент, который вы используете.
    • (необязательно) загрузите эти установочные пакеты на веб-сайт.

Другими словами, воспользуйтесь возможностью начать использовать Final Builder.

0 голосов
/ 05 апреля 2011

Перемещение номеров версий в код также легко обойти.

Один из способов передачи информации - это сгенерировать файл version.rc программным способом (вы сами пишете крошечный инструмент для сборки, используя delphi или язык сценариев по вашему выбору) и связываете ресурсы с программой вместо использования встроенного в информации о версии.

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

Поэтому я предлагаю вам зашифровать номер версии и использовать зашифрованную версию вместо версии в структуре VersionInfo.

Я использовал DCPCRYPT для подобных вещей. Но если вы надеетесь быть защищенным от хакеров, позвольте мне сказать это; Все, что вы можете сделать, хакеры могут отменить. Если вы хотите быть более безопасным, вам также нужно будет проверить все ваше приложение. Существуют коммерческие решения для защиты от взлома, но ни одно из них не работает из коробки с Delphi.

...