2013-01-09 65 views
5

我需要将我的delphi项目的版本设置为与另一个项目(不是delphi)相同的构建脚本的一部分。有没有办法通过IDE来控制版本号,例如编译器的命令行参数或类似的东西?由于更改构建时的版本号

+1

这就是为什么您应该停止让IDE控制版本资源并将您自己的版本资源生成脚本编写为预生成操作 –

+0

@david您是否有指示如何做到这一点? –

+2

看看类似FinalBuilder的东西,它可以让你设置所有的EXE等到相同的内部编号,并确保一致的编译参数等。 – mj2008

回答

12

包括像

{$R 'version.res'} 
在您的项目

线。并用您的版本信息创建一个version.rc文件。你将不得不使用brcc32在老的Delphi版本中自己构建资源。在较新的Delphi版本中,您可以使用

{$R 'version.res' 'version.rc'} 

让IDE自动为您构建它。

最简单的version.rc看起来是这样的:

1 VERSIONINFO 
FILEVERSION 9999, 9999, 99, 18048 
PRODUCTVERSION 9999, 9999, 99, 18048 
FILEOS 0x00000004L // comment: VOS_WINDOWS32 
FILETYPE VFT_APP 
{ 
BLOCK "VarFileInfo" 
{ 
    VALUE "Translation", 0x409, 0x4E4 // comment: 0x4E4 = 1252 
} 

BLOCK "StringFileInfo" 
{ 
    BLOCK "040904E4" 
    { 
    VALUE "CompanyName", "Company Name\0" 
    VALUE "FileVersion", "9999.9999.99.18048\0" 
    VALUE "LegalCopyright", "Copyright \0" 
    VALUE "ProductName", "Product Name\0" 
    VALUE "ProductVersion", "9999.9999.99.18048\0" 
    VALUE "Homepage", "http://www.mydomain.com\0" 
    } 
} 
} 

欲了解更多信息,请参阅MSDN上​​3210结构。

+0

+1,因为这是我使用的解决方案,但您确实需要确保删除version.res,否则对version.rc的更改不会被链接器注意到。 –

+0

@BrianFrost:你使用的是什么版本的Delphi?我从来没有遇到过这个问题。你确实在项目选项中关闭了“包含版本信息”? –

+0

我的错误。我发现当我移动到* .rc中的#include以用于版本编号时,我需要删除* .res,所以我没有修改* .rc而是只包含我的包含文件,它只有实际的版本号。 –

1

Marjan在上面给出了一个很好的答案,但我的回答稍微回答了一些问题。考虑这个RC文件:

VS_VERSION_INFO VERSIONINFO 

#include "..\Ver_Num_Application.txt" 
#define APPLICATION_NAME "My amazing project\0" 
#define VER_NUM_ARTWORKS 4 
#include "..\Libraries\Paslib32\Ver_Num_Library.txt" 
#define COMPANY_NAME  "My company\0" 

FILEVERSION VER_NUM_ARTWORKS, VER_NUM_LIBRARY, VER_NUM_APPLICATION, 1000 
FILEFLAGSMASK 0x3fL 
#ifdef _DEBUG 
FILEFLAGS 0x9L 
#else 
FILEFLAGS 0x8L 
#endif 
FILEOS 0x4L 
FILETYPE 0x1L 
FILESUBTYPE 0x0L 
BEGIN 
    BLOCK "StringFileInfo" 
    BEGIN 
     BLOCK "040904b0" 
     BEGIN 
      VALUE "CompanyName", COMPANY_NAME 
      VALUE "FileDescription", APPLICATION_NAME 
      VALUE "LegalCopyright", "Copyright (C) "COMPANY_NAME 
      VALUE "ProductName", APPLICATION_NAME 
     END 
    END 
    BLOCK "VarFileInfo" 
    BEGIN 
     VALUE "Translation", 0x409, 1200 
    END 
END 

在使用几个#include语句的好处是,你可以独自离开RC文件,然后简单地修改(甚至自动生成)的* .TXT包括像文件:

Ver_Num_Application.txt: 
    #define VER_NUM_APPLICATION 6 

Ver_Num_Library.txt: 
    #define VER_NUM_LIBRARY 156 

注意,现在你必须运行您的构建,以强制链接从生成它们之前删除* .RES文件(可能改变)的版本号。

+0

使用条件定义,在dpr中使用{$ R ...}不同的version.res/rc对会不会更容易? IE'{$ ifdef DEBUG} {$ R version.res debugversion.rc} {$ ELSE} {$ R version.res version.rc} {$ ENDIF}'这不像其他信息会经常改变... –

+0

真正。我想我想为我的所有项目提供一个'标准'RC文件,并且需要一个扩展名为* .txt的文件以记事本打开。 –

+1

Aaww come'on Brian,我可以理解一个“标准”文件,但是一个txt文件?我确定你知道如何将.RC文件与记事本关联为默认编辑器? ;-) –