65.9K
CodeProject 正在变化。 阅读更多。
Home

使用宏在 Visual C++ .NET 中增加构建号

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.41/5 (18投票s)

2004年5月19日

CPOL

4分钟阅读

viewsIcon

228722

downloadIcon

961

为 Visual C++ .NET 实现了一个宏,用于在项目 .RC 文件的 VERSIONINFO 定义中自动递增构建号。

VERSIONINFO Sample Screenshot

引言

有很多解决方案可以实现自动构建号递增。其中许多是为 VC6 设计的。我找到的适用于 Visual C++ .NET 的方案通常使用 DevStudio 的插件。通常,它们是一种良好且高度集成的解决方案,但都有一个缺点:不够灵活。它们需要某种单独的头文件,其中包含 `define`,这些 `define` 必须在项目的资源文件中使用。而且,如果您想以某种方式调整插件的功能以更贴合您的需求,通常无法获得插件的源代码。

因此,我尝试寻找一个 VC.NET 的宏而不是插件,但很遗憾没有成功。这就是我决定编写自己的宏并将其公之于众的原因。您可以根据自己的需要对其进行修改,或者将其作为自己宏实现的模板示例。

功能

我的宏实现会响应 DevStudio 在构建开始时的事件。该宏会扫描当前解决方案中 **所有** 项目的资源文件(仅限扩展名为 .RC 的文件)。所有扩展名不是 .RC 的文件都将被跳过。

在资源文件中,该宏将搜索 **所有** `VERSIONINFO` 定义,并在其中递增所有 4 个语句 `FILEVERSION`、`PROJECTVERSION`、“`FileVersion`” 和 “`ProjectVersion`” 的构建号。它还会处理多个语言块(如果存在)。

**要禁用** 解析 .RC 文件,请在 .RC 文件中的某个位置指定以下代码行:

#define Disable_IncBuildNrMacro

如果您未指定此行或已注释掉,则 .RC 文件将被解析并递增构建号。

DevStudio **语言** 相关说明

在构建过程开始时,`IncBuildNr` 宏会输出有关操作 .RC 文件成功或失败的信息消息,或者在 .RC 文件被跳过时输出消息。这些消息将显示在输出窗口的“生成”窗格中,编译器也会在该窗格中插入其自身的进度信息。该宏是为 DevStudio 的英文版本实现的。如果您的 DevStudio 使用的是其他语言,则该宏可能找不到正确的输出窗口窗格。这是因为该宏只是打开一个名为“生成”的窗格。如果您的 DevStudio 中用于构建进度信息的输出窗口窗格名称不同,建议相应地更改宏源代码中的窗格名称(在模块 EnvironmentEvents 中,在函数 BuildEvents_OnBuildBegin() 中)。

您可以在宏源代码本身中找到更多描述(当您在 DevStudio 的宏编辑器中打开它时)。

安装说明

首先,导航到您的 Visual Studio 宏所在的位置。默认情况下,它是 Personal\Visual Studio Projects\VSMacros。在此目录中,创建一个名为 IncBuildNrMacro 的子目录,并将 IncBuildNrMacro.vsmacros 文件复制到其中。

现在,打开 VC++ .NET DevStudio,打开宏资源管理器,右键单击根项“宏”,然后选择“加载宏项目”。打开 IncBuildNrMacro.vsmacros。会出现一个警告,告知您加载的宏包含事件处理代码。选择“启用事件处理代码”,然后按 OK。这是必需的,否则宏将不会响应构建启动。

就是这样。下次构建项目时,`IncBuildNr` 宏将自动调用。

卸载说明

在 VC++ .NET DevStudio 中,转到宏资源管理器,右键单击“IncBuildNrMacro”,然后选择“卸载宏项目”。如果愿意,您可以删除 IncBuildNrMacro.vsmacros 文件。

在您的 C++ 项目中使用

要在运行时查询应用程序中的 `VERSIONINFO` 定义内容,请使用 `GetFileVersionInfo()` 及其相关函数。

缺点

**所有** 项目中的 **所有** .RC 文件都会被同时处理。即使用户只想生成当前解决方案中的某个特定项目,该宏也会递增解决方案中所有项目的构建号。我(尚未)找到一种方法来检测正在编译哪些项目。虽然这可以被视为一个缺点,但也可以被视为一个优点:所有项目的构建号始终会同时处理。因此,所有项目的构建号保持准确和一致。

但是,如果您找到了检测正在生成特定项目的方法,请告诉我。

此外,每当项目资源在 DevStudio 中打开(无论是在资源视图(树状视图)还是在资源编辑窗口中,如对话框编辑器、图标编辑器等)时,宏都会首先关闭所有这些窗口,以便能够访问资源文件的内容。(例外:资源视图工具窗口将保持显示。)每次启动构建过程时,所有资源窗口都消失可能会很烦人。但同样,我还没有找到解决此问题的其他方法。也许您有更好的想法。如果有,请告诉我。

历史

  • 2004 年 5 月 20 日。

    这是 `IncBuildNrMacro` 的第一个版本。

© . All rights reserved.