4. 资源数据格式
对任何预定义的数据类型,所有结构都是双字对齐的,包括位图、图标、字体头结构等等。因此,数据总是从双字边界开始。
4.1 版本资源
版本资源用来记录使用资源文件的程序的版本。版本资源包含固定数量的信息。它的结构如下:
typedef struct tagVS_FIXEDFILEINFO {
DWORD dwSignature; //e.g. 0xfeef04bd
DWORD dwStrucVersion; //e.g. 0x00000042 = "0.42"
DWORD dwFileVersionMS; //e.g. 0x00030075 = "3.75"
DWORD dwFileVersionLS; //e.g. 0x00000031 = "0.31"
DWORD dwProductVersionMS; //e.g. 0x00030010 = "3.10"
DWORD dwProductVersionLS; //e.g. 0x00000031 = "0.31"
DWORD dwFileFlagsMask; // = 0x3f 对应版本 "0.42"
DWORD dwFileFlags; //e.g. VFF_DEBUG | VFF_PRERELEASE
DWORD dwFileOS; //e.g. VOS_DOS_WINDOWS16
DWORD dwFileType; //e.g. VFT_DRIVER
DWORD dwFileSubType; //e.g. VFT2_DRV_KEYBOARD
DWORD dwFileDateMS; //e.g. 0
DWORD dwFileDateLS; //e.g. 0
} VS_FIXEDFILEINFO;
4.2 图标资源
.RC脚本中的ICON语句创建的并不是一个单独的资源对象,而是一组资源。这使得Windows程序具有一定的设备独立性(根据不同的硬件配置使用不同的象素位图图标)。Windows组合一组不同象素位数和个数的位图并将它们作为一个图标资源。但在.RES和.EXE文件中,它们被以一组资源的格式存储。这些组被以组件(在此,是不同的图标[type 3])在前,后跟组头信息([Type 14])的格式存储。组头包含必要的信息以使Windows能够选择合适的图标来显示。
组件有如下的格式:
[资源头(type = 3)]
[DIB头]
[图标XOR(异或)掩码的颜色DIBits (Color DIBits of icon XOR mask)]
[AND(与)掩码的单色DIBits (Monochrome DIBits of AND mask)]
每个组件都有一个唯一的序数ID(相对于其它图标组件)。
DIB(设备无关位图)头的域分别描述了掩码的信息,仅有两项例外。第一,高度域同时描述 异或 和 与掩码。在将两个DIB转换为DDB(设备相关位图)之前,高度应当被除2。掩码的大小是固定的,占DIB头大小的一半。第二,每个象素的位数和位的数量参考异或掩码。与掩码总是单色的,只有一个面,每象素一位。在使用图标之前,请先参考一下windows sdk参考材料中关于DIB的信息。由于图标组件的格式与.ico文件非常相似,因此Windows SDK参考文档的9.2节还是很有用的。Windows 32应用程序不应使用DDB。
组头如下描述:
[组头(type = 14)]
struct IconHeader {
WORD wReserved; // 当前为0
WORD wType; // 图标在此等于1
WORD wCount; // 组件的数量
WORD padding; // 为使双字对齐的填充数据
};
下面的结构每个组件都有一个:
struct ResourceDirectory {
BYTE bWidth;
BYTE bHeight;
BYTE bColorCount;
BYTE bReserved;
WORD wPlanes;
WORD wBitCount;
DWORD lBytesInRes; // 指向组件
WORD wNameOrdinal;
WORD padding; // 填充数据
};
注意:组头由固定的头和重复的组件数据组成。这两部分都有固定的长度,以使能对组件信息进行随机访问。
组头包含了所有来自.ico头和资源描述器的数据。
4.3 菜单资源
菜单资源由一个菜单头后跟一个菜单项的序列组成。有两种类型的菜单项:弹出式(popup)的和一般的菜单项。MENUITEM SEPERATOR是一种特殊的一般菜单项,它的名称为空、ID为0、标志也为0。它们的格式如下:
[资源头(type = 4)]
struct MenuHeader {
WORD wVersion; //当前为0
WORD cbHeaderSize; //也为0
};
下面这些项对每一个菜单项都重复:
弹出式菜单项(以 fItemFlags & POPUP 为标志):
struct PopupMenuItem {
WORD fItemFlags;
WCHAR szItemText[];
};
一般菜单项(以 !(fItemFlags & POPUP) 为标志):
struct NormalMenuItem {
WORD fItemFlags;
WORD wMenuID;
WCHAR szItemText[];
};
wVersion与cbHeaderSize结构成员标识菜单模板的版本。对Windows3.0它们皆为0,但将来可能会增加。
单字fItemFlags是一个描述菜单项的标志集合。若POPUP位被设置,则此项为弹出式的。否则它就是一个一般菜单项。还有几个其它的位标志:
(待续)
对任何预定义的数据类型,所有结构都是双字对齐的,包括位图、图标、字体头结构等等。因此,数据总是从双字边界开始。
4.1 版本资源
版本资源用来记录使用资源文件的程序的版本。版本资源包含固定数量的信息。它的结构如下:
typedef struct tagVS_FIXEDFILEINFO {
DWORD dwSignature; //e.g. 0xfeef04bd
DWORD dwStrucVersion; //e.g. 0x00000042 = "0.42"
DWORD dwFileVersionMS; //e.g. 0x00030075 = "3.75"
DWORD dwFileVersionLS; //e.g. 0x00000031 = "0.31"
DWORD dwProductVersionMS; //e.g. 0x00030010 = "3.10"
DWORD dwProductVersionLS; //e.g. 0x00000031 = "0.31"
DWORD dwFileFlagsMask; // = 0x3f 对应版本 "0.42"
DWORD dwFileFlags; //e.g. VFF_DEBUG | VFF_PRERELEASE
DWORD dwFileOS; //e.g. VOS_DOS_WINDOWS16
DWORD dwFileType; //e.g. VFT_DRIVER
DWORD dwFileSubType; //e.g. VFT2_DRV_KEYBOARD
DWORD dwFileDateMS; //e.g. 0
DWORD dwFileDateLS; //e.g. 0
} VS_FIXEDFILEINFO;
4.2 图标资源
.RC脚本中的ICON语句创建的并不是一个单独的资源对象,而是一组资源。这使得Windows程序具有一定的设备独立性(根据不同的硬件配置使用不同的象素位图图标)。Windows组合一组不同象素位数和个数的位图并将它们作为一个图标资源。但在.RES和.EXE文件中,它们被以一组资源的格式存储。这些组被以组件(在此,是不同的图标[type 3])在前,后跟组头信息([Type 14])的格式存储。组头包含必要的信息以使Windows能够选择合适的图标来显示。
组件有如下的格式:
[资源头(type = 3)]
[DIB头]
[图标XOR(异或)掩码的颜色DIBits (Color DIBits of icon XOR mask)]
[AND(与)掩码的单色DIBits (Monochrome DIBits of AND mask)]
每个组件都有一个唯一的序数ID(相对于其它图标组件)。
DIB(设备无关位图)头的域分别描述了掩码的信息,仅有两项例外。第一,高度域同时描述 异或 和 与掩码。在将两个DIB转换为DDB(设备相关位图)之前,高度应当被除2。掩码的大小是固定的,占DIB头大小的一半。第二,每个象素的位数和位的数量参考异或掩码。与掩码总是单色的,只有一个面,每象素一位。在使用图标之前,请先参考一下windows sdk参考材料中关于DIB的信息。由于图标组件的格式与.ico文件非常相似,因此Windows SDK参考文档的9.2节还是很有用的。Windows 32应用程序不应使用DDB。
组头如下描述:
[组头(type = 14)]
struct IconHeader {
WORD wReserved; // 当前为0
WORD wType; // 图标在此等于1
WORD wCount; // 组件的数量
WORD padding; // 为使双字对齐的填充数据
};
下面的结构每个组件都有一个:
struct ResourceDirectory {
BYTE bWidth;
BYTE bHeight;
BYTE bColorCount;
BYTE bReserved;
WORD wPlanes;
WORD wBitCount;
DWORD lBytesInRes; // 指向组件
WORD wNameOrdinal;
WORD padding; // 填充数据
};
注意:组头由固定的头和重复的组件数据组成。这两部分都有固定的长度,以使能对组件信息进行随机访问。
组头包含了所有来自.ico头和资源描述器的数据。
4.3 菜单资源
菜单资源由一个菜单头后跟一个菜单项的序列组成。有两种类型的菜单项:弹出式(popup)的和一般的菜单项。MENUITEM SEPERATOR是一种特殊的一般菜单项,它的名称为空、ID为0、标志也为0。它们的格式如下:
[资源头(type = 4)]
struct MenuHeader {
WORD wVersion; //当前为0
WORD cbHeaderSize; //也为0
};
下面这些项对每一个菜单项都重复:
弹出式菜单项(以 fItemFlags & POPUP 为标志):
struct PopupMenuItem {
WORD fItemFlags;
WCHAR szItemText[];
};
一般菜单项(以 !(fItemFlags & POPUP) 为标志):
struct NormalMenuItem {
WORD fItemFlags;
WORD wMenuID;
WCHAR szItemText[];
};
wVersion与cbHeaderSize结构成员标识菜单模板的版本。对Windows3.0它们皆为0,但将来可能会增加。
单字fItemFlags是一个描述菜单项的标志集合。若POPUP位被设置,则此项为弹出式的。否则它就是一个一般菜单项。还有几个其它的位标志:
(待续)