Win32 二进制资源格式(续七)(完)

4.8 字符串表资源

这些表由16个字符串所组成的块(blocks of 16 strings)构成。这些块的组织取决于字符串的ID。ID的最低4位指定字符串在块中的位置,高12位指定字符串在哪个块中。每个块存储为一个资源项。每个字符串或错误表资源块的存储格式如下:

    [一般资源头(type = 6)]
   
        [字符串块。字符串为Pascal格式,在其第一个单字存储其长度。不管有没有字符串,16个块都会填满。其中没有字符串的位置其单字长度值置0。]

注意在资源文件中块不一定会按顺序存储。每个块都被赋予一个序数ID。这个ID值等于字符串ID的高12位再加1(因此序数ID总大于等于1)。块以其在.rc文件中出现的次序存储在.res文件中,再由CVTRES工具将其顺序存储在COFF对象中,再到最终的映像文件中去。

4.9 加速键表资源

加速键表存储为单个资源,允许多个加速键表同时存在。加速键表的格式很简单:没有表头,表中的每个项都是一个四字项。表的最后一项标以十六进制值0x0080(fFlags |= 0x0080)。由于所有项都是定长的,因此可以对其进行随机访问(表中元素数可由资源的长度除以8获得)。下面是加速键表的结构:

    [一般资源头(type = 9)]

下面的结构对每个表项都重复:

struct AccelTableEntry {
  WORD   fFlags;
  WORD   wAscii;
  WORD   wId;
  WORD   padding;
  };

4.10 用户自定义的资源与RCDATA

资源编译器允许程序员包含自定义的资源。用户可以选择一个没有被定义为标准类型的名称来包含一些想要作为资源存储的数据。这个数据可以来自外部文件,也可以放在BEGIN语句和END语句之间。作为可选项,程序员可以将此类型定义为RCDATA来达到相同的效果。

可以想象,这种资源的格式是非常简单的,因为资源编译器不知道这些数据的任何逻辑结构。其组织结构如下:

    [一般资源头(对RCDATA,type = 10;有名称的类型则为用户自定义的类型)]
   
    [BEGIN和END之间的数据或者来自外部文件的数据将不经过翻译而被直接包含在.res文件中去]

4.11 名字表与错误表资源

Windows二进制资源文件格式不支持名字表和错误表资源。

4.12 版本资源

版本资源指定可以被安装程序使用(用来确定系统应当安装此程序或动态链接库的哪一个版本)的信息。也有一个API集合用来查询版本资源。版本资源中存储了三种主要的信息:在VS_FIXEDFILEINFO结构中的主要信息、在可变文件信息(VarFileInfo)结构中的语言信息以及在StringFileInfo中的用户定义的字符串信息。对Windows 32,版本信息资源中的字符串以Unicode格式存储,以备资源的本地化。每块信息都是双字对齐的。

版本资源的结构由VS_VERSION_INFO结构描述。

VS_VERSION_INFO {
    WORD wLength;             /* 版本资源的长度 */
    WORD wValueLength;        /* 这个块的值域长度 */
    WORD wType;               /* 信息类型:  1==字符串, 0==二进制 */
    WCHAR szKey[];            /* Unicode 字符串 KEY 域 */
    [WORD Padding1;]          /* 可能的填充数据 */
    VS_FIXEDFILEINFO Value;   /* 固定文件信息 结构 */
    BYTE Children[];      /* VarFileInfo 或 StringFileInfo 数据的位置 */
};
 
固定文件信息 结构包含版本的基本信息,包括产品和文件的版本号、文件的类型。
 
typedef struct tagVS_FIXEDFILEINFO {
    DWORD dwSignature;        /* 签名 - 总是 0xfeef04bd */
    DWORD dwStrucVersion;     /* 结构版本,当前为0 */
    DWORD dwFileVersionMS;    /* 主版本信息 */
    DWORD dwFileVersionLS;    /* 次版本信息 */
    DWORD dwProductVersionMS; /* 主产品版本号 */
    DWORD dwProductVersionLS; /* 次产品版本号 */
    DWORD dwFileFlagMask;     /* 文件标志掩码 */
    DWORD dwFileFlags;        /*  调试/零售/预发布/... */
    DWORD dwFileOS;           /* 操作系统类型,将总是 Windows 32 值 */
    DWORD dwFileType;         /* 文件类型 (dll/exe/drv/... )*/
    DWORD dwFileSubtype;      /* 文件子类型 */
    DWORD dwFileDateMS;       /* 日期主要部分 */
    DWORD dwFileDateLS;       /* 日期次要部分 */
} VS_FIXEDFILEINFO;
 
用户定义的字符串信息包含在StringFileInfo结构中,它是一个双字符串的集合:信息关键字和信息本身。
 
StringFileInfo {
    WCHAR       szKey[];      /* Unicode "StringFileInfo" */
    [WORD        padding;]    /* 可能的填充数据 */
    StringTable Children[];
};
 
StringTable {
    WCHAR      szKey[];   /* 表示语言的 Unicode 字符串 - 8 字节 */
    String Children[];    /* 子String结构的数组 */
}
 
String {
    WCHAR   szKey[];          /* Unicode编码的KEY字符串 */
                         /* 注意:有一个预定义的关键字列表 */
    [WORD   padding;]         /* 可能的填充数据 */
    WCHAR Value[];            /* Unicode编码的KEY值 */
} String;
 
可变文件信息(VarFileInfo)块包含一个这个版本的应用程序或动态链接库所支持的语言列表 。
 
VarFileInfo {
    WCHAR szKey[];            /* Unicode "VarFileInfo" */
    [WORD padding;];          /* 可能的填充数据 */
    Var        Children[];    /* 子数组 */
};
 
Var {
    WCHAR szKey[];       /* Unicode "Translation" (或其它用户定义的关键字) */
    [WORD padding;]      /* 可能的填充数据 */
    WORD  Value[];       /* 一般情况下是语言的一个或多个值 */
};
 
4.13 消息表(Messagetable)资源

消息表是一个包含已格式化的文本的资源。此文本用来显示一个错误消息或消息框。它代替了错误表资源(从来没使用过)。它的数据由一个MESSAGE_RESOURCE_DATA结构组成。此结构包含一个或多个MESSAGE_RESOURCE_BLOCK,而后者又包含一个或多个MESSAGE_RESOURCE_ENTRY结构。这个结构与STRINGTABLE资源相似。

typedef struct _MESSAGE_RESOURCE_DATA {
    ULONG NumberOfBlocks;
    MESSAGE_RESOURCE_BLOCK Blocks[];
} MESSAGE_RESOURCE_DATA, *PMESSAGE_RESOURCE_DATA;
 
typedef struct _MESSAGE_RESOURCE_BLOCK {
    ULONG LowId;
    ULONG HighId;
    ULONG OffsetToEntries;
} MESSAGE_RESOURCE_BLOCK, *PMESSAGE_RESOURCE_BLOCK;
 
typedef struct _MESSAGE_RESOURCE_ENTRY {
    USHORT Length;
    USHORT Flags;
    UCHAR Text[];
} MESSAGE_RESOURCE_ENTRY, *PMESSAGE_RESOURCE_ENTRY;
 
若USHORT标志(Flags)是MESSAGE_RESOURCE_UNICODE(值为0x0001),则字符串在当前代码页将会被编码为UNICODE,而不是ASCII。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值