分享
 
 
 

[原创]使用#定义方便控制版本号的宏

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

一个 VC Project 中,可能有很多地方需要用到版本号,比如 About 对话框、版本资源等。如果每次版本更改都一一去改变这些值,不但非常麻烦,而且有悖唯一原则。

巧妙地使用宏定义,可以很好地解决这个问题。

先来看看几个预处理操作符 (Preprocessor Operators):

Operator

Action

Stringizing operator (#)

Causes the corresponding actual argument to be enclosed in double quotation marks

Charizing operator (#@)

Causes the corresponding argument to be enclosed in single quotation marks and to be treated as a character (Microsoft Specific)

Token-pasting operator (##)

Allows tokens used as actual arguments to be concatenated to form other tokens

简单说,# 就是使参数用引号包住,形成字符串;#@ 使参数用单引号包住,形成一个字符;## 是粘结符。这几个操作符从语言上来说比较晦涩,仔细看看 MSDN 的例子,好好理解一下。

下面举例说一下怎么定义统一的版本宏。

假设工程中有资源脚本文件 Resource.rc,唯一的版本号码存放在 Define.h 里。其它需要用到版本号的 CPP 文件均包含此文件。

先看看 Define.h:

#define VER_Major 2

#define VER_Minor 2

#define VER_Release 137

#define VER_Build 1762

#define VER_Version MAKELONG(MAKEWORD(VER_Major, VER_Minor), VER_Release)

#define _Stringizing(v) #v

#define _VerJoin(a, b, c, d) _Stringizing(a.b.c.d)

#define STR_BuildDate TEXT(__DATE__)

#define STR_BuildTime TEXT(__TIME__)

#define STR_BuilDateTime TEXT(__DATE__) TEXT(" ") TEXT(__TIME__)

#define STR_Version TEXT(_VerJoin(VER_Major, VER_Minor, VER_Release, VER_Build))

假设有了上面的定义后,就可以方便地使用 VER_Major、VER_Minor、VER_Release、VER_Build 作为版本号数字;STR_Version 作为版本字符串 (上面的例子中 STR_Version 执行宏展开后是 TEXT("2.2.137.1763") 的 TCHAR 字符串)。任何 CPP 文件中可以直接使用这些宏定义。

资源脚本 Resource.rc 中,假设我们需要版本资源,可以首先在 Define.h 中再定义一些宏,比如:

#define STR_AppName TEXT("CuteFoto")

#define STR_Author TEXT("Yonsm")

#define STR_Corporation TEXT("Yonsm.NET")

#define STR_Web TEXT("Yonsm.reg365.com")

#define STR_Email TEXT("Yonsm@163.com")

#define STR_WebUrl TEXT("http://") STR_Web

#define STR_EmailUrl TEXT("mailto:") STR_Email TEXT("?Subject=") STR_AppName

#ifdef _CHS

#define STR_Description TEXT("灵巧的批量扫描照片切割工具。")

#define STR_Copyright TEXT("版权所有 (C) 2002-2004 ") STR_Corporation TEXT(",保留所有权利。")

#else // _CHS

#define STR_Description TEXT("Picture cutting tool for batch-scanned photo.")

#define STR_Copyright TEXT("Copyright (C) 2002-2004 ") STR_Corporation TEXT(". All rights reserved.")

#endif // _CHS

这时,我们在 Resouurc.rc 中添加版本资源——注意,不要直接添加,否则会被 VS 更改成实际的值,这样就不能达到我们的目的了。一个好的解决方法是:

在 VS IDE 中双击 Resource.rc 转到 资源视图 中,右击 Resource.rc,选择“资源包括”,在“只读符号指令”中包含 Define.h:

#define APSTUDIO_HIDDEN_SYMBOLS

//……

#include "Define.h"

#include "Windows.h"

//……

#undef APSTUDIO_HIDDEN_SYMBOLS

在“编译时指令”中输入:

LANGUAGE LANG_NEUTRAL, SUBLANG_DEFAULT

#pragma code_page(DEFAULT)

VS_VERSION_INFO VERSIONINFO

FILEVERSION VER_Major, VER_Minor, VER_Release, VER_Build

PRODUCTVERSION VER_Major, VER_Minor, VER_Release, VER_Build

FILEFLAGSMASK VS_FFI_FILEFLAGSMASK

FILEFLAGS 0

FILEOS VOS__WINDOWS32

FILETYPE 0

FILESUBTYPE VFT2_UNKNOWN

BEGIN

BLOCK "StringFileInfo"

BEGIN

BLOCK "040004e4"

BEGIN

VALUE "FileVersion", STR_Version

VALUE "FileDescription", STR_Description

VALUE "ProductName", STR_AppName

VALUE "ProductVersion", STR_Version

VALUE "CompanyName", STR_Corporation

VALUE "LegalCopyright", STR_Copyright

VALUE "Comments", "Powered by " STR_Author "."

VALUE "OriginalFilename", STR_AppName EXT_Exe

END

END

BLOCK "VarFileInfo"

BEGIN

VALUE "Translation", 0x0400, 0x04e4

END

END

OK,以后要更改版本号或程序信息,只要修改 Define.h 即可了。

继续……

Define.h 中假设 VER_Release/VER_Build 分别指 Release 号和 Build 号,如果让这两个值分别表示我们用 Release 方式编译的次数和总编译次数,多好:)为此我写了个小工具 BPP (Build++ 的意思):

首先把 BPP.exe 放在工程目录下,然后在 VC Project 属性中,Debug 方式:在“生成事件”->“预生成事件”->“命令行”中输入“BPP Define.h”,Release 方式:“BPP -Release Define.h”。这样,每次 VC 编译都会调用 BPP.exe 使 VER_Build 或 VER_Reelase 自增一。好酷酷吧……

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有