• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: 小 中 大 | 推荐给好友 上一篇 | 下一篇

释放程序中的资源到文件

发布: 2007-7-01 20:40 | 作者: admin | 来源: | 查看: 15次 | 进入软件测试论坛讨论

领测软件测试网

方法一:使用CreateFile和WriteFile

 HRSRC  res=::FindResource(NULL,  MAKEINTRESOURCE(IDR_JPG1),  "jpg");
 HGLOBAL  gl=::LoadResource(NULL,res);
 LPVOID  lp=::LockResource(gl);   //  查找,加载,锁定资源   
 
 
 CString strFileName("d:\\Temp.jpg");
 CFileFind  fFind;
 BOOL bExist=fFind.FindFile(strFileName);   //判断文件是否存在
 fFind.Close ();
 
 if(!bExist)   //如果文件不存在则创建
 {
  HANDLE fp=::CreateFile(strFileName,
           GENERIC_WRITE,
           FILE_SHARE_READ ,
           NULL,
           CREATE_NEW, //创建新文件,如目标文件已存在则调用失败
           0,
           NULL); 
  DWORD aa;             
  if (!::WriteFile (fp,lp,::SizeofResource(AfxGetResourceHandle(),res),&aa,NULL))
   return;      //sizeofResource 得到资源文件的大小
  
  ::CloseHandle (fp);       //关闭句柄
  ::FreeResource (gl);     //释放内存
 }

方法2:使用CFile

 CString strFileName("d:\\Temp.jpg");
 CFileFind  fFind;
 BOOL bExist=fFind.FindFile(strFileName);   //判断文件是否存在
 fFind.Close ();

 if(!bExist)
 {
  HRSRC hResInfo = ::FindResource(NULL,(LPCSTR)IDR_JPG1,"jpg");
  HGLOBAL hRes = ::LoadResource(NULL,hResInfo ); 

  CFile ff;
  ff.Open( "temp.jpg", CFile::modeCreate | CFile::modeWrite, NULL))
  ff.WriteHuge((LPSTR)hRes, ::SizeofResource(::AfxGetResourceHandle(), hResInfo)  );  //写入文件
  ff.Close();
 }

函数说明:


函数原型:HRSRC FindResourceEx(HXODULE hModule,LPCTSTR lpType,LPCTSTR lpName,WORD wLanguage);

函数功能:该函数确定指定模块中指定类型、名称及语言的资源所在位置。

参数:

hModule:处理包含资源的可执行文件的模块。如果参数值为NULL,则函数搜索曾经创建的最近过程的模块。

lpType:指向以NULL为结束符的字符串,它指定了被列举出的资源类型名称。若要了解更多的信息,请参见注意部分。作为标准类型,这个参数取值同EnumResLangProc\lpType。

lpName:指向说明资源文件名称并以NULL为结束符的字符串。若要了解更多的信息,请参见注意部分。

WLanguage:指明语言资源。若此参数为MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL),则为了指定零一种语言,可以使用宏创建这个参数。更多的信息请参见MAKELANGID。

返回值:如果函数运行成功,其返回值是一个指定资源信息块的句柄。为了获得资源,要将此句柄传递给LoadResource函数。如果函数运行失败,返回值为空。若想获得更多的错误信息,请调用GetLastError函数。


函数原型; HGLOSAL LoadResouare(HMODULE hModule,HRSRC hReslnfo);

函数功能:该函数装载指定资源到全局存储器。

参数:

hModule:处理包合资源的可执行文件的模块句柄。若hModule为NULL,系统从当前过程中的模块中装载资源。

hReslnfo:将被装载资源的句柄。它必须由函数FirtdResource或FindResourceEx创建。

返回值:如果函数运行成功,返回值是相关资源的数据的句柄。如果函数运行失败,返回值为NULL。若想获得更多的错误信息,请调用GetLastError函数。

注意:LoadResource的返回类型是向后兼容的HGLOBAL型,而不是因为函数返回一个全局存储块句柄。不要传递这个句柄给函数GlobalLock或GlobalFree。为了得到更多资源数据信息,请调用LockResource函数。

当使用完资源后,必须通过调用函数以释放加速器表、位图、光标、图标以及菜单所占的内存资源:加速器表:DestroyAcceleratorTable;位图:DeleteObject;光标:DestroyCursor;图标:Destroylcon;菜单:DestroyMenu。

当过程创建终止时,系统将自动删除这些资源。但是调用相关函数也可以保留内存减少过程的工作设置所占空间。


函数功能:该函数锁定内存中的指定资源。

函数原型:LPVOID LockResource(HGLOBAL hResDate);

参数:

hResDate:被装载的资源的句柄。函数LosdResource可以返回这个句柄。

返回值:如果被装载的资源被所住了,返回值是资源第一个字节的指针;否则为NULL。

注意:通过使用函数FindResource或FindResourceEx返回句柄试图所住资源,不再工作。可以返回一个错误的数据和任意数据的指针。

当使用完资源后,必须通过调用函数以释放加速器表、位图、光标、目标以及某单所占的内存资源:加速器表:DestroyAcceleratorTable;位图:DeleteObject;光标:DestroyCursor;图标:Destroylcon;菜单:DestroyMenu。

当过程创建终止时,系统将自动删除这些资源。但是调用相关函数也可以保留内存减少过程的工作设置所占空间。


FreeResource()

函数功能:该函数已过时。它为16位的基于Win32的应用程序提供了一个简单的端口。对于Win32应用程序(32位)没有必要释放用LoadResource函数装载资源。由LoadResource所获得的资源随着被装载模块的卸载自动被释放。但是,为了保留内存减少的程序工作设置所占空间大小,必须通过调用下列表中的函数以释放加速器表、位图、光标、图标以及菜单所占的内存资源。

加速器表:DestroyAcceleratorTable;位图:DeleteObject;光标:DestroyCursor;

图标:Destroylcon;菜单:DestroyMenu。

 


延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:[email protected] 电话:010-51297073

软件测试 | 领测国际 | ISTQB | ISTQB官网 | TMMi | TMMi认证 | 国际软件测试工程师认证 | 领测软件测试网