WIN32汇编语言教程:第05章 使用资源 · 5.7 二进制资源和自定义资源
5.7.1 使用二进制资源
在第02章中曾经提到DOS的exe文件可以带一个覆盖部分,覆盖部分实际上就是在真正的可执行部分后面附加的数据,然后由程序在运行中打开自身文件并使用这些数据。Win32的可执行文件中除了上面介绍的这些标准类型的资源外,也可以在程序中附带其他数据,当然方法完全不同——Win32资源中允许用户自己定义二进制的资源或者自定义格式的资源,资源的内容可以是任何数据,也可以将一个磁盘文件按二进制格式包括进去。
二进制资源的定义格式是:
资源ID RCDATA [DISCARDABLE]
BEGIN 数据定义 ... END
也可以用一个磁盘文件当做资源的内容:
资源ID RCDATA [DISCARDABLE] 文件名
在程序中要使用资源的内容时,可以通过以下步骤将资源装入内存使用:
(1)用FindResource(hInstance,lpName,lpType)查找资源。lpName的值为资源ID,lpType的值为RT_RCDATA,如果找到资源。那么函数返回一个资源信息句柄。
(2)用LoadResource(hInstance, hResInfo)装入资源。hResInfo是上一步中得到的资源信息句柄,装入成功的话函数会返回一个资源句柄。
(3)用LckResource(hResData)将资源锁定到内存中。hResData是上一步得到的资源句柄,函数返回资源装入的内存地址,程序就可以使用内存中的数据了。
(4)如果想知道装入资源的大小是多少,可以使用FindResource返回的hResInfo来调用SizeofResource(hInstance,hResInfo)从而得到资源大小。
下面是一个装入资源ID为ID_MYRES的RCDATA类型资源的例子:
invoke FindResource,hInstance,ID_MYRES,RT_RCDATA ;寻找资源 .if eax mov hResInfo,eax invoke SizeofResource,hInstance,eax ;获取资源尺寸 mov dwResSize,eax invoke LoadResource,hInstance,hResInfo ;装入资源 .if eax invoke LockResource,eax ;锁定资源 .if eax mov lpRes,eax ;处理lpRes指向的资源内容 .endif .endif .endif
5.7.2 使用自定义资源
自定义资源的定义格式比二进制资源更灵活,它和二进制资源的区别在于可以指定资源类别为自定义的名称:
资源ID 类型ID [DISCARDABLE]
BEGIN 数据定义 ... END
或用一个磁盘文件当做资源的内容:
资源ID 类型ID [DISCARDABLE] 文件名
类型ID可以是大于255的数值(255及以下的数值由Windows使用)或字符串,如可以定义如下:
1000 WAVE "Hello.wav" ;定义类型为“WAVE”,资源ID为1000的资源 1000 TEXT "Readme.txt" ;定义类型为“TEXT”,资源ID为1000的资源 1000 1000 "Test.bin" ;定义类型ID为1000,资源ID为1000的资源
在程序中使用自定义资源的方法和使用二进制资源类似,惟一的区别是使用FindResource得到hResInfo的参数有些区别,得到hResInfo以后的步骤是一模一样的。针对上面3句定义,查找资源的方法可以是:
szResType1 db "WAVE",0 szResType2 db "TEXT",0 ... invoke FindResource,hInstance,1000,addr szResType1 ;针对上面第一句 invoke FindResource,hInstance,1000,addr szResType2 ;针对上面第二句 invoke FindResource,hInstance,1000,1000 ;针对上面第三句
在使用完二进制或自定义资源以后,不必使用任何函数去释放它们,Windows在程序退出的时候会自动将它们释放。
上页:第05章 使用资源 · 5.6 版本信息资源(2) 下页:第06章 定时器 · 6.1 定时器简介/6.2 定时器的使用(1)