关键字: 从内存中加载文件 | 调用自定资源 | 自义资源管理
资源函数(Resource)
一个资源是一些二进制数据,可以添加到Win32应用程序的可执行文件中。资源既可以是标准的,也可以是自己定义的。标准资源中的数据包括图标、光标、菜单、对话框、位图、增强元文件、字体、加速键表、消息表入口、字符串表入口或版本。应用程序定义的资源(也称为定制的资源)可以包含特殊应用程序所需的任何数据。
使用资源函数可以添加、删除、拷贝、替换或加载各种资源数据。
FindResource FindResourceEx LoadResource LockResource SizeofResouce UnlockResource
FreeResource BeginUpdateResource UpdateResource LoadImage CopyImage
FindResource 函数功能:该函数确定指定模块中指定类型和名称的资源所在位置。
函数原型:HRSRC FindResource(HMODULE hModule,LPCTSTR lpName,LPCTSTR lpType);
参数:
hModule:处理包含资源的可执行文件的模块。NULL值则指定模块句柄指向操作系统通常情况下创建最近过程的相关位图文件。
lpName:指定资源名称。若想了解更多的信息,请参见注意部分。
lpType:指定资源类型。若想了解更多的信息,请参见注意部分。作为标准资源类型。这个参数的含义同EnumResLangProc/lpType。
返回值:如果函数运行成功,那么返回值为指向被指定资源信息块的句柄。为了获得这些资源,将这个句柄传递给LoadResource函数。如果函数运行失败,则返回值为NULL。若想获得更多错误信息,请调用GetLastError函数。
注意:如果参数lpType或lpName的高字节为O,那么其低字节中所给定的资源的类型或名称标识说明。另外,这些参数指向以NULL为终止符的字符串。字符串的第一个字符是#,后面的字符表示十进制数来表示源类型或名称的整数标识符。例如。字符串"#258"表示整数标识符258。
如果用整数标识符替代名称提交资源,用程序将减少所需的内存容量。
当使用完加速器表,位图,光标,图标,或是菜单后,可以通过调用下表所列举的函数释放内存。加速器表:DestroyAcceleratorTable;位图:DeleteObject;光标:DestroyCursor;图标:Destroylcon;菜单DestroyMenu。
当过程创建资源终止时,系统将自动删除这些资源。然而通过调用适当的函数可以保留内存,减少过程中工作设置所需的空间大小。
应用程序可以使用FindResource函数去查找任何种类资源,但是这个函数只有在应用程序并发调用LoadLibray和LockResource函数来存取二进制资源时才被使用。
如果想立即使用某一资源,应用程序将使用下面详细资源函数列表中某一函数去查找装载所需资源,FormatMessage:装裁且格式化信息表接口:LoadAccclerators:装载加速器表;LoadBltmap:装载位图资源;LoadCursor:装载光标资源;Loadlcon:装载图标资源;
LoadMenu:装载菜单资源;LoadString:装载字符串表资源。
例如,应用程序可以使用Loadlcon函数装载某一图标以在屏幕上显示。但是,如果是装载某一图标为了将它的数据复制到另一个应用程序中,那么这个应用程序就应该使用FindResource和LoadResource函数。
字符串资源存储在由若干部分组成的某区域,每部分有16个字符串。每部分的字符串是按统一计数方式排列的有序队形式存储的。
TheLoadstring函数将从相应的区域中摘取字符串资源。
参数hModule不能为NULL句柄。
参数lpName不支持ID为零的资源,即FindResource(h,o,t)不能按预期工作。
不可能在IpTyPe参数中传递RT_ANICURSOR或RT_ANllCON的值。
速查:Windows NT3.1、Windows95、Windows CE1.0以上,头文件:winbase.h;库文件:kerne132.lib;Unicode;在Windows和Windows NT上实现为Unicode和ANSI两种版本。
LoadResouare 函数功能:该函数装载指定资源到全局存储器。
函数原型; HGLOSAL LoadResouare(HMODULE hModule,HRSRC hReslnfo);
参数:
hModule:处理包合资源的可执行文件的模块句柄。若hModule为NULL,系统从当前过程中的模块中装载资源。
hReslnfo:将被装载资源的句柄。它必须由函数FirtdResource或FindResourceEx创建。
返回值:如果函数运行成功,返回值是相关资源的数据的句柄。如果函数运行失败,返回值为NULL。若想获得更多的错误信息,请调用GetLastError函数。
注意:LoadResource的返回类型是向后兼容的HGLOBAL型,而不是因为函数返回一个全局存储块句柄。不要传递这个句柄给函数GlobalLock或GlobalFree。为了得到更多资源数据信息,请调用LockResource函数。
当使用完资源后,必须通过调用函数以释放加速器表、位图、光标、图标以及菜单所占的内存资源:加速器表:DestroyAcceleratorTable;位图:DeleteObject;光标:DestroyCursor;图标:Destroylcon;菜单:DestroyMenu。
当过程创建终止时,系统将自动删除这些资源。但是调用相关函数也可以保留内存减少过程的工作设置所占空间。
Windows CE:参数hModule必须为非空。
速查:Windows NT 3.1、Windows 95、Windows CE1.0以上,头文件:winbase.h;库文件:kernel132.lib。
LockResource 函数功能:该函数锁定内存中的指定资源。
函数原型:LPVOID LOCkResource(HGLOBAL hResDate);
参数:
hResDate:被装载的资源的句柄。函数LosdResource可以返回这个句柄。
返回值:如果被装载的资源被所住了,返回值是资源第一个字节的指针;否则为NULL。
注意:通过使用函数FindResource或FindResourceEx返回句柄试图所住资源,不再工作。可以返回一个错误的数据和任意数据的指针。
当使用完资源后,必须通过调用函数以释放加速器表、位图、光标、目标以及某单所占的内存资源:加速器表:DestroyAcceleratorTable;位图:DeleteObject;光标:DestroyCursor;图标:Destroylcon;菜单:DestroyMenu。
当过程创建终止时,系统将自动删除这些资源。但是调用相关函数也可以保留内存减少过程的工作设置所占空间。
速查:Windows NT 3.1、Windows 95、Windows CE 1.0以上,头文件:winbase.h;库文件:kerne132.lib。
SizeofResource 函数功能:该函数返回指定资源字节数大小。
函数原型:DWORD SizeofResource(HMODULE hModule,HRSRC hReslnfo);
参数:
hModule:包合资源的可执行文件模块的句柄。
hReslnfo:资源句柄。此句柄必须由函数FindResource或FindResourceEx来创建。
返回值:如果函数运行成功,返回值资源的字节数。如果函数运行失败,返回值为零。若想获得更多的错误信息,请调用GetLastError函数。
速查:Windows NT 3.1、Windows 95、Windows CE 1.0以上,头文件:winbase.h;库文件:kerne132.lib。
UpdateResource 函数功能:该函数增加,删除,或替代某可执行文件中的资源。
函数原型:BOOL UPdateResource(HANDLE hUpdate,LPCTSTR lPTyPe,LPCTSTR IPName,WORD wLanguage,LPVOID lgData,DWORD cbData);
参数:
hUpdate:指定更新文件句柄。此句柄由BeginUpdateResource函数返回。
lpType:指向说明将被更新的资源类型的字符串,它以NULL为终止符。这个参数可以是一个通过宏MAKENTRESOURCE传递的整数值,含义参见EnumResLangProc\lpType。
lpName:指向说明待被更新的资源名称的字符串,它以NULL为终止符。这个参数可以是一个通过宏MAKEINTRESOURCE传递的整数值。
wLanguage:指定将被更新资源的语言标识。要了解基本的语言标识符以及由这些标识符组成的字语言标识符的列表,可参见宏MAKELANGID。
lpData:指向被插入可执行文件的资源数据的指针。如果资源是预定义类型值之一,那么数据必须是有效且适当排列的。注意这是存储在可执行文件中原始的一进制数据,而不是由Loadlcon,LoadString或其他装载特殊资源函数提供的数据。所有包含字符串、文本的数据必须是Unicode格式;IpData不能指向ANSI数据。
如果lpData为NULL,所指定的资源将从可执行文件中被删除。
cbData:指定lpData中的资源数据数据大小,以字节计数。
返回值:如果函数运行成功,返回值为非零;如果函数运行失败,返回值为零。若想获得更多的错误信息,请调用GetLastError函数。
注意:应用程序重复使用UpdateResource去改变资源数据。每次UpdateResource调用都要占用系统内部的一个增加、删除、替代的列表,而实际上并没有将数据写到可执行文件中。应用程序必须通过使用EndUpdateResource函数将每次积累的变化写入可执行文件中。
速查:Windows NT 3.1以上,头文件:winbase.h;库文件:kerne132.lib;Unicode:在Windows NT上实现为Unicode和ANSI两种版本。
LoadImage 函数功能:该函数装载目标,光标,或位图。
函数原型:HANDLE LoadImage(NINSTANCE hinst,LPCTSTR lpszName,UINT uType,int cxDesired,int CyDesired,UINT fuLoad);
参数:
hinst:处理包含被装载图像模块的特例。若要装载OEM图像,则设此参数值为O。
lpszName:处理图像装载。如果参数hinst为非空,而且参数fuLoad不包括LR_LOADFROMFILE的值时,那么参数lpszName是一个指向保留在hinst模块中装载的图像资源名称,并以NULL为结束符的字符串。
如果参数hinst为空,并且LR_LOADFROMFILE被指定,那么这个参数低位字一定是被装载的OEM图像标识的。OEM图像标识符是在WINUSER.H头文件中定义的,下面列举出前缀的含义:
OBM_ OEM:位图;OIC_OEM图标;OCR_OEM:光标。
如果参数fuLoad包含LR_LOADFROMFILE值,那么参数lpszName是包含有图像的文件名。
uType:指定被装载图像类型。此参数可以为下列值,其含义如下:
IMAGE_BITMAP:装载位图;IMAGE_CURSOR:装载光标;IMAGE_ICON:装载图标。
cxDesired:指定图标或光标的宽度,以像素为单位。如果此参数为零并且参数fuLoad值为LR_DEFAULTSIZE,那么函数使用SM_CXICON或SM_CXCURSOR系统公制值设定宽度;如果此参数为零并且值LR_DEFAULTSIZE没有被使用,那么函数使用目前的资源宽度。
cyDesired:指定图标或光标的高度,以像素为单位。如果此参数为零并且参数fuLoad值为LR_DEFAULTSIZE,那么函数使用SM_CXICON或SM_CXCURSOR系统公制值设定高度;如果此参数为零并且值LR_DEFAULTSIZE没有被使用,那么函数使用目前的资源高度。
fuLoad:根据下面复合值列表指定函数值,值含义如下:
LR_DEFAULTCOLOR:缺省标志;它不作任何事情。它的含义是“无LR_MONOCHROME”。
LR_CREATEDIBSECTION:当参数uType指定为IMAGE_BITMAP时,使得函数返回一个DIB部分位图,而不是一个兼容的位图。这个标志在装载一个位图,而不是映射它的颜色到显示设备时非常有用。
LRDIFAULTSIZE:若 cxDesired或cyDesired未被设为零,使用系统指定的公制值标识光标或图标的宽和高。如果这个参数不被设置且cxDesired或cyDesired被设为零,函数使用实际资源尺寸。如果资源包含多个图像,则使用第一个图像的大小。
LR_LOADFROMFILE:根据参数lpszName的值装载图像。若标记未被给定,lpszName的值为资源名称。
LW_LOADMAP3DCOLORS:查找图像的颜色表并且按下面相应的3D颜色表的灰度进行替换。
颜色替代:Dk Gray RGB(128,128,128)COLOR_3DSHADOW;Gray RGB(192,192,192)COLOR_3DFACELt Gray RGB(223,223,223) COLOR_3DLIGHT LR_LOADTRANSPARENT;找到图像中的一个像素颜色值并且根据颜色表中系统的缺省颜色值替代其相应接口的值。图像中所有使用这种接口的像素的颜色都变为系统的缺省窗体颜色。此至仅用来申请相应的颜色表。
若fuLoad包括LR_LOADTRANSPARENT和LR_LOADMAP3DCOLORS两个值,则LRLOADTRANSPARENT优先。但是,颜色表接口由COLOR_3DFACE替代,而不是COLOR_WINDOW。
LR_MONOCHROME:装载黑白图。
LR_SHARED:若图像将被多次装载则共享。如果LR_SHARED未被设置,则再向同一个资源第二次调用这个图像是就会再装载以便这个图像且返回不同的句柄。
不要对不同标准尺寸的图像使用LR_SHARED,装载后可能会有改变,或是从文件中被装载。
Windows 95和Windows 98:函数根据缓存中被请求的资源名发现的第一个图像,不管被请求的大小。LR_VGACOLOR:使用VGA真彩色。
返回值:如果函数运行成功,返回值是相关资源的数据的句柄。如果函数运行失败,返回值为NULL。若想获得更多的错误信息,请调用GetLastError函数。
注意:当使用完资源后,必须通过调用函数以释放加速器表、位图、光标、图标以及菜单所占的内存资源;加速器表:DesteoyAcceleratorTable;位图:DeleteObject;光标:DestroyCursor;图标:Destroylcon;菜单:DestroyMenu
当过程创建终止时,系统将自动删除这些资源。但是调用相关函数也可以保留内存减少过程的工作设置所占空间。
Windows CE:对IMAGE_BITMAP来说,参数cxDesred和cyDesred p必须为零。Windows CE不支持图表跳跃或闪烁。
参数fuLoad必须为(=LR_DEFAULTCOLOR)。
如果的目标平台不支持鼠标光标,可以指定在参数cxDesred和cyDsired的SM_CXCURSOR和SM_CYCURSOR的值,但不能指定参数uType中IMAGE_CURSOR的值。
如果目标平台支持鼠标光标,可以指定在参数cxDesired和cyDesred的SM_CXCURSOR和SM_CYCURSOR的值,也能指定参数uType中IMAGE_CURSOR的值。
速查:Windows NT 3.1、Windows 95、Windows CE 1.0以上,头文件:minuser.h:库文件;user32.lib;Unicode:在Windows NT上实现为Unicode和ANSI两种版本。
CopyImage 函数功能:该函数创建一个新的图像(图标、光标、位图)并复制该指定图像的属性到新的图像。若有必要,该函数将伸展位值以填满新图像所需要的尺寸。
函数原型:HANDLE CopyImage(HANDLE hlmage,UjNT uTyPe,int cxDesired,int cyDesired,UINT fuFlags)
参数:
hImage:指向包含将被复制图像的模型中的一个特例的句柄。
uType:说明被复制图像的类型,此参数将可能是如下值:
IMAGE_BITMAP:表示复制一个位图;IMAGE_CURSOR;表示复制一个光标。
IMAGE_ICON:表示复制一个图标。
cxDesired:用来指定图像所需的像素宽度。
cyDesired:用来指定图像所需的像素高度。
fuFlags:指定下列复合值,其含义具体如下:
LR_COPYDELETEORG:表示创建一个副本后删除原始图像。
LR_COPYRETURNORG;表示创建一个图像的精确副本,而忽略参数cxDesired和cyDesired。
LR_MONOCHROME:表示创建一个新的单色图像。
LR_COPYFROMRESOURCE;表示试图从原始资源文件中再装载图标或光标资源而不是简单的复制当前图像。这使得在含有多种尺寸资源的资源文件中再创建一个不同尺寸的副本时非常有用。若没有这个标志,Copylmage函数将伸展原始图像到新的尺寸;若此标志被设置,Copylmage函数将在资源文件中选择使用最接近所期待尺寸的值。
此函数只有在Loadlcon、LoadCursor或Loadlmage函数中的hlmage参数被装载成LR_SHARED值时才运行成功的。
返回值:如果函数运行成功,其值将返回最新创建图像的句柄;如果函数运行失败,其值将返回空。若想获得更多的错误信息,请调用GetLastError函数。
注意:当使用完资源后,可以调用下表中列举的函数以释放相关内存。
Resource Release function资源释放函数:Bitmap DeleteObject 位图:DeleteObject;
Cursor DestroyCursor 光标:DestroyCursorr;lcon Destroylcon 图标: Destroylcon。
当过程终止时,系统将自动删除这些资源。因而,调用相关函数可以节省内存空间且减少过程工作设置所需空间的大小。
速查:Windows NT 3.5 Windows 95以上,头文件:winuserh;库文件:user32.lib。