MinGW编译Windows程序添加文件属性中的版本信息

Windows应用程序或DLL文件,通过Windows资源管理器查看文件属性,其中可以看到文件说明、产品名称与版本、版权等信息,Microsoft官方称之为VERSIONINFO(版本信息资源)。本文讲述在使用MinGW编译Windows程序时如何添加此版本信息资源。

Windows应用程序开发中,版本信息定义于VersionInfo.rc文件中。因此我们首先需要一个文件模板:
以下两个分别来源于微软官方和网络:

微软:

#define VER_FILEVERSION             3,10,349,0
#define VER_FILEVERSION_STR         "3.10.349.0\0"

#define VER_PRODUCTVERSION          3,10,0,0
#define VER_PRODUCTVERSION_STR      "3.10\0"

#ifndef DEBUG
#define VER_DEBUG                   0
#else
#define VER_DEBUG                   VS_FF_DEBUG
#endif

VS_VERSION_INFO VERSIONINFO
FILEVERSION     VER_FILEVERSION
PRODUCTVERSION  VER_PRODUCTVERSION
FILEFLAGSMASK   VS_FFI_FILEFLAGSMASK
FILEFLAGS       (VER_PRIVATEBUILD|VER_PRERELEASE|VER_DEBUG)
FILEOS          VOS__WINDOWS32
FILETYPE        VFT_DLL
FILESUBTYPE     VFT2_UNKNOWN
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904E4"
        BEGIN
            VALUE "CompanyName",      VER_COMPANYNAME_STR
            VALUE "FileDescription",  VER_FILEDESCRIPTION_STR
            VALUE "FileVersion",      VER_FILEVERSION_STR
            VALUE "InternalName",     VER_INTERNALNAME_STR
            VALUE "LegalCopyright",   VER_LEGALCOPYRIGHT_STR
            VALUE "LegalTrademarks1", VER_LEGALTRADEMARKS1_STR
            VALUE "LegalTrademarks2", VER_LEGALTRADEMARKS2_STR
            VALUE "OriginalFilename", VER_ORIGINALFILENAME_STR
            VALUE "ProductName",      VER_PRODUCTNAME_STR
            VALUE "ProductVersion",   VER_PRODUCTVERSION_STR
        END
    END

    BLOCK "VarFileInfo"
    BEGIN
        /* The following line should only be modified for localized versions.     */
        /* It consists of any number of WORD,WORD pairs, with each pair           */
        /* describing a language,codepage combination supported by the file.      */
        /*                                                                        */
        /* For example, a file might have values "0x409,1252" indicating that it  */
        /* supports English language (0x409) in the Windows ANSI codepage (1252). */

        VALUE "Translation", 0x409, 1252

    END
END

第二个模板:

1 VERSIONINFO
 FILEVERSION ${PROJECT_VERSION_MAJOR}, ${PROJECT_VERSION_MINOR}, ${PROJECT_VERSION_PATCH}
 PRODUCTVERSION ${PROJECT_VERSION_MAJOR}, ${PROJECT_VERSION_MINOR}, ${PROJECT_VERSION_PATCH}
 FILEFLAGSMASK 0x17L
#ifdef _DEBUG
 FILEFLAGS 0x1L
#else
 FILEFLAGS 0x0L
#endif
 FILEOS 0x4L
 FILETYPE 0x0L
 FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904b0"
        BEGIN
            VALUE "FileDescription", "MyLibrary Binary"
            VALUE "FileVersion", "${PROJECT_VERSION_MAJOR}, ${PROJECT_VERSION_MINOR}, ${PROJECT_VERSION_PATCH}"
            VALUE "InternalName", "MyLibrary"
            VALUE "LegalCopyright", "Copyright (C) 2019"
            VALUE "OriginalFilename", ""
            VALUE "ProductName", "MyLibrary"
            VALUE "ProductVersion", "${PROJECT_VERSION_MAJOR}, ${PROJECT_VERSION_MINOR}, ${PROJECT_VERSION_PATCH}"
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x409, 1200
    END
END

按照以上两个模板生成的exe文件,语言会显示英语,如果需要修改为中文,则需要对以下两个地方进行修改:

BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "080404b0"
    . . .

    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x804, 1200

可见前面的0804是语言代码,后面是字符集标识,Translation部分的1200,其十六进制就是上面StringFileInfo04b0,上下两处的值要对应,否则编译出的exe文件,版本信息会显示错误)

VersionInfo.rc文件如果包含中文,则需要使用GB2312编码保存。若使用UTF-8,则中文会乱码。

按照模板修改得到资源文件后,需要首先编译资源文件为.o文件。MinGW存在一个专门用于编译资源文件的windres程序,使用以下命令将其编译为VersionInfo.o

windres VersionInfo.rc -O coff -o VersionInfo.o

然后通过在GCC编译程序命令中添加VersionInfo文件进行目标程序编译:

gcc -o MyAPP.exe MyAPP.c VersionInfo.o

参考资料:

VERSIONINFO 资源 - Win32 apps | Microsoft Learn
https://learn.microsoft.com/zh-cn/windows/win32/menurc/versioninfo-resource

VarFileInfo BLOCK 语句 - Win32 apps | Microsoft Learn
https://learn.microsoft.com/zh-cn/windows/win32/menurc/varfileinfo-block

StringFileInfo BLOCK 语句 - Win32 apps | Microsoft Learn
https://learn.microsoft.com/zh-cn/windows/win32/menurc/stringfileinfo-block

CMake为DLL添加版本信息 - 知乎
https://zhuanlan.zhihu.com/p/97512450

标签: MinGW, VERSIONINFO

添加新评论

(头像使用Gravatar服务,如需自定义,请访问Gravatar.com)