Win32汇编--使用资源--二进制资源与自定义资源
1、使用二进制资源
DOS的exe文件可以带一个覆盖部分,覆盖部分实际上就是在真正的可执行部分后面附加的数据,然后由程序在运行中打开自身文件并使用这些数据。Win32的可执行文件中除了上面介绍的这些标准类型的资源外,也可以在程序中附带其他数据,当然方法完全不同——Win32资源中允许用户自己定义二进制的资源或者自定义格式的资源,资源的内容可以是任何数据,也可以将一个磁盘文件按二进制格式包括进去。
二进制资源的定义格式是:
资源ID REDATA [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
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” ;定义类型为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在程序退出的时候会自动将它们释放。