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)

第05章 使用资源

版权所有 © 云南伯恩科技 证书:粤ICP备09170368号