原帖地址:http://support.microsoft.com/?id=237870
可以编写一个程序来修改资源编译器 (.rc) 文件,而不是此处使用上述步骤。 但是,RC 文件是受控于 Visual C++。 Visual C++ 修改保存,时 RC 的文件,并可能会影响版本资源。 本节中介绍的方法可以应用到任何 Visual C++ 项目。 此示例使用 Microsoft 基础类项目。
创建新项目使用 MFC (EXE) Appwizard 并调用它 MyProject 。 MyProject 需要了包含 MyProject.rc2 的 MyProject.rc 文件。 .rc2 文件意味着对于用户定义的资源。 请执行这些步骤以增加每个生成后 MyProject 的版本信息:
- 从.rc 文件中删除版本资源并将其置于.rc2 文件:
- 在文本编辑器中打开 MyProject.rc 和 MyProject.rc2 (位于 res 文件夹,)。 要使用 Visual C++ 编辑器,单击 文件 菜单上的 打开 ,然后选择 MyProject.rc 文件 另存为打开 列表中的 文本 。
- 找到版本资源语句 MyProject.rc 中。 它应当类似下面:
///
//
// Version
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,0,1
PRODUCTVERSION 1,0,0,1
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x4L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "Comments", "Sample Application/0"
VALUE "CompanyName", "Microsoft Corp./0"
VALUE "FileDescription", "MyProject MFC Application/0"
VALUE "FileVersion", "1, 0, 0, 1/0"
VALUE "InternalName", "MyProject/0"
VALUE "LegalCopyright", "Copyright (C) 1999/0"
VALUE "OriginalFilename", "MyProject.EXE/0"
VALUE "ProductName", "MyProject Application/0"
VALUE "ProductVersion", "1, 0, 0, 1/0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END
- 剪切 MyProject.rc 文件中的版本资源,并将其粘贴到下面注释在 MyProject.rc2 文件"添加手动编辑的资源"。 有关每个资源中字段的含义请参阅帮助中的 VERSIONINFO 资源声明。
- FILEVERSION 和 PRODUCTVERSION 数据替换 FILEVER 和 PRODUCTVER 的宏。 同样,替换宏 STRFILEVER 和 STRPRODUCTVER 文件版本和 ProductVersion 字符串数据。
- 添加 # VS_VERSION_INFO 资源语句之前的立即包括 VersionNo.h 。 现在看版本资源喜欢:
///
//
// Version
//
#include "VersionNo.h"
VS_VERSION_INFO VERSIONINFO
FILEVERSION FILEVER
PRODUCTVERSION PRODUCTVER
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x4L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "Comments", "Sample Application/0"
VALUE "CompanyName", "Microsoft Corp./0"
VALUE "FileDescription", "MyProject MFC Application/0"
VALUE "FileVersion", STRFILEVER
VALUE "InternalName", "MyProject/0"
VALUE "LegalCopyright", "Copyright (C) 1997/0"
VALUE "OriginalFilename", "MyProject.EXE/0"
VALUE "ProductName", "MyProject Application/0"
VALUE "ProductVersion", STRPRODUCTVER
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END
- 创建名为您的项目在同一目录中的 VersionNo.h 一个标头文件。 此文件将包含以下语句在步骤 2 中使用的宏的定义:
#define FILEVER 1,0,0,1
#define PRODUCTVER 1,0,0,1
#define STRFILEVER "1, 0, 0, 1/0"
#define STRPRODUCTVER "1, 0, 0, 1/0"
现在,MyProject.rc 文件包括 MyProject.rc2,并 MyProject.rc2 文件包括 VersionNo.h。 - 使 用 Visual Basic 脚本宏将修改 VersionNo.h 文件内容。 宏下面介绍句柄,Visual C++ BuildFinish 事件以便它将不激发生成完成之前。 只要此 VB 脚本代码调用,首先增加在头文件的版本号固定的量,然后它会将文件保存并关闭它。 在随后的生成过程中可执行文件中包含新的版本号。
安装和使用 VB 脚本代码,请执行下列操作:
- 打开现有的 DSM (宏) 文件或在 Visual C++ 中创建新 DSM 文件。 若要创建一个新的文件,单击 文件 菜单上的 新建 ,在 文件 选项卡上选择 宏文件 ,试一个的名称,单击 确定 。
- 粘贴以下 VB 脚本代码下面 (一个空的 DSM 文件无法安装在 Visual C++ ; 下一步介绍了安装):
Function GetProjectDir(FullName)
'VC++ doesn't provide any method for getting the path of the active project
'See the VB Script reference for more information on the VB Script functions
'used in this function
Dim proj_path
proj_path = Split(StrReverse(FullName),"/",-1,1)
Dim count
count = UBound(proj_path)
Dim full_path
full_path = ""
Dim i
for i = 1 to count
full_path = full_path & "/" & proj_path(i)
next
GetProjectDir = StrReverse(full_path)
End Function
Sub ReplaceText(selection, count, incrementby)
'selection represents the TextSelection object
'count represents the position of the version number to be incremented
'incrementby represents a number that will be added to the existing version number
selection.WordRight dsMove, count
selection.WordRight dsExtend, 1
Dim str
str = selection.Text
str = str + incrementby
selection.Text = str
End Sub
Sub Application_BuildFinish(numError, numWarning)
'This event will be triggered after every build of a project
'You can check numError and/or numWarning to determine if you want to continue
'If numError <> 0 Then
'exit sub
'Obtain the full path of the active project
Dim full_path
full_path = GetProjectDir(ActiveProject.FullName)
full_path = full_path & "versionno.h"
'Open the VersionNo.h file
Documents.Open full_path
'Obtain the TextSelection object
Dim selection
set selection = ActiveDocument.Selection
selection.StartOfDocument
'Increment the version information
ReplaceText selection, 9, 1
selection.LineDown
selection.StartOfLine
ReplaceText selection, 9, 1
selection.LineDown
selection.StartOfLine
ReplaceText selection, 10, 1
selection.LineDown
selection.StartOfLine
ReplaceText selection, 10, 1
ActiveDocument.Save
ActiveDocument.Close
End Sub
- 如果没有已安装,请安装 DSM 文件。 要安装, 工具 菜单上单击 自定义 ,单击 加载项和宏文件 选项卡、 浏览以选择该 DSM 文件并单击 关闭 。
- 从 生成 菜单中选择 生成 MyProject.exe 。 生成完成后,打开 VersionNo.h 文件。 它将包含以下语句:
#define FILEVER 1,0,0,2
#define PRODUCTVER 1,0,0,2
#define STRFILEVER "1, 0, 0, 2/0"
#define STRPRODUCTVER "1, 0, 0, 2/0"