如何在Delphi应用程序中使用项目版本信息?

3
我使用“项目选项/版本”来管理版本信息(格式为N.N.N.N)。
然而,在我的项目中,我复制了这些信息。
因此,如果在“项目选项”中我正在使用版本2.4.3.178, 那么在我的应用程序中,有4个整数变量保存这4个数字。
我手动设置它们。
Major := 2;
Minor := 4;
Release := 3;
Build := 178;

这是因为我基于版本号授权。所以,如果用户购买了“2.4”版本,就不允许升级到“3.0”版本。
但是,如果我依赖项目版本信息,用户可以使用资源修改工具更改版本信息,从而“激活”产品。
用户无法以同样的方式更改4个变量(至少不那么容易)。
这可以运行,但是需要我复制信息。
你能推荐更好的方法吗?
换句话说,有没有一种方法可以使用我写入这4个变量中的数据来编写版本信息?类似于后构建事件,但是如何将数据传递给后构建事件呢?

你想要哪个?防篡改的?还是自动化的?或者方便的?这些都要吗?这是一个很高的要求。 - Warren P
3个回答

3

您需要一个预构建事件而不是后构建事件,因为您希望在链接之前构建.res文件。

我用一个简单的Perl脚本做了类似的事情,它读取包含版本号常量声明的包含文件(.inc)。我使用正则表达式读取它们,然后创建我的.rc文件并将其传递给brcc32。这都是作为预构建操作调用的。


你也可以在构建后事件中通过替换exe中的资源来完成,但是预构建事件似乎是更合理的选择。由于用户使用Delphi-XE,他有Final Builder,可以使用它和INI文件自动化构建,跳过Perl脚本。+1 - Cosmin Prund
一些 Perl 或 Python 脚本,加上一些不对称加密和 MIME64 编码,也许就可以构建一个可靠的版本欺骗预防系统。 - Warren P

2
由于您正在使用Delphi-XE并拥有Final Builder,为什么不好好利用它来制作您的“最终”构建呢?它可以为版本号问题提供非常好的解决方案,并且可以做更多事情。
以下是我会如何做:
1.设置一个小的INI文件,其中包含版本信息的相关部分。
2.可选地创建一个小型Delphi表单应用程序,从INI文件中读取版本号并给您一个机会进行更改。当将更改保存到INI文件时,Delphi应用程序应自动生成一个定义常量的小型Delphi PAS文件!
3.创建一个FinalBuilder项目,执行以下操作:
- 调用您的Delphi exe以设置版本号。您将负责更改任何需要更改的内容,这可能是适当的,因为您的许可方案取决于版本信息。 - 设置一些项目变量来保存版本信息数字 - 添加“读取INI文件”操作,将版本信息从ini文件读入您的项目变量中。 - (可选)构建单元测试项目(如果有)。 - (可选)调用单元测试项目。 - 添加“构建Delphi项目”操作,将其设置为使用所需选项构建您的项目。添加一个小的“Before”脚本,以将版本信息数字设置为您刚从INI文件中读取的项目变量中的内容。 - (可选)使用您使用的任何工具创建安装程序包。 - (可选)将这些安装程序包上传到网站。
换句话说,抓住机会开始使用Final Builder。

这些是很好的观点,但是OP似乎更关心防篡改而不是构建自动化。 - Warren P

0
将您的版本号移入代码也很容易避免。
一种传递信息的方法是通过程序生成version.rc文件(您可以使用Delphi或所选脚本语言编写自己的小型构建工具),并将资源链接到程序中,而不是使用内置的版本信息功能。
您的问题似乎基本上是防止用户在确定版本号后轻松修改版本号的问题。
因此,我的建议是加密版本号并使用加密版本替代VersionInfo结构中的版本号。
我已经为此类事情使用了DCPCRYPT。但如果您希望成为黑客专业人员,请让我说一句话:任何您能做的事情,黑客都可以撤销。如果您想要更安全,还需要对整个应用程序进行篡改保护。商业防篡改解决方案有,但是没有一个与Delphi完美无缺地配合。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接