前言 

在VC环境中除了我们所常用的Dialog、Menu和Bitmap等标准资源类型之外,它还支持自定义资源类型(Custom Resource),我们自定义资源类型能做些什么呢?呵呵,用处多多。

1.      默认的皮肤压缩包或语言包。一些支持换肤的软件特别是一些媒体播放器常常有自定义的皮肤文件(你可以尝试将Media Player或千千静听等软件的Skins目录下的文件的扩展名改为.zip,然后使用WinZip打开看一下),但为了防止Skin文件丢失导致软件无 法显示,他们常常会在EXE文件中内置一套Skin作为默认的皮肤文件。同样,一些支持多语言的EXE文件中存在默认语言包也是这个道理(当然也可以使用 "String Table"资源类型);

2.      做为一些病毒/木马程序的寄生方式。如果不小心执行了带有病毒/木马的程序,它们会在你运行时释放出病毒/木马文件。当然许多病毒是将自身写入PE文件头来实现;

3.      合并EXE与它所需要的DLL文件。出于某些原因程序作者有时可能需要将DLL文件嵌入到可执行的EXE文件中,这可以通过使用自定义资源来实现;

4.      其它需要在程序中播放一个AVI动画等等,都可以通过将二进制的数据文件作为自定义资源加入到可执行文件中来实现;

添加资源

  添加资源时选择自定义,IDE会为你生成一个新的二进制资源,然后你就可以将你已经存在的二进制文件作为自定义的资源类型导入到项目中来了。

使用资源

  要使用自定义资源,我们可能要用到的几个API函数有FindResource、LoadResource和LockResource等,这里每一个函数的返回值分别作为下一个函数的参数,我来简要介绍一下。

    FindResource用来在一个指定的模块中定位所指定的资源:
HRSRC FindResource
(HMODULE hModule,        //包含所需资源的模块句柄,如果是程序本身,可以置为NULLLPCTSTR lpName,         //可以是资源名称或资源IDLPCTSTR lpType          //资源类型,在这里也就是我们自己指定的资源类型
);  LoadResource用来将所指定的资源加载到内存当中;
HGLOBAL LoadResource
(HMODULE hModule,        //模块句柄,同上HRSRC hResInfo          //需要加载的资源句柄,这里也就是FindResource的返回值
);LockResource用来锁定内存中的资源数据块,它的返回值也就是我们要使用的直系指向资源数据的内存指针;
LPVOID LockResource
(HGLOBAL hResData         //指向内存中要锁定的资源数据块,这里也就是LoadResource的返回值
); 

  另外我们还需要用SizeofResource来确定资源的尺寸,我们在操作资源时要用到它。

函数原型:DWORD SizeofResource(HMODULE hModule,HRSRC hReslnfo);
参数:
hModule:包合资源的可执行文件模块的句柄,如果是程序本身,可以置为NULL
hReslnfo:资源句柄。此句柄必须由函数FindResource或FindResourceEx来创建。
返回值:如果函数运行成功,返回值资源的字节数。如果函数运行失败,返回值为零。若想获得更多的错误信息,请调用GetLastError函数。

在FindResource函数中经常用到宏MAKEINTERSOURCE来获得资源名称参数(LPCTSTR lpName),因为该参数需要LPCTSTR类型参数。MAKEINTERSOURCE是一个资源名转换的宏,这个宏是把一个数字类型转换成字符指针类型的宏,它不存在释放的问题。

它仅仅是把一个"数字形ID",转化为"字符串".但是执行前后,输入的数据的内容和长度是不变的!它只不过就是C语言里面"强制类型转换"而已.

用这个宏的主要原因是有的资源是用序号定义的,而不是字符串.所以要把数字转换成字符串指针,然后再传递给LoadResource之类的函数,这样才加载了资源.

(要释放资源(用LoadResource加载的)可以调用FreeResource函数把LoadResource返回的指针传递给FreeResource.)

在资源使用完毕后我们不需要使用 UnlockResource和FreeResource来手动地释放资源,因为它们都是16位Windows遗留下来的,在Win32中,在使用完毕后系统会自动回收。它们的使用很简单,大致上是这个样子的:

BOOL UseCustomResource()
{//定位我们的自定义资源,这里因为我们是从本模块定位资源,所以将句柄简单地置为NULL即可HRSRC hRsrc = Findresource(null, MAKEINTRESOURCE(ITEMID), TEXT("MyType"));if (NULL == hRsrc)return FALSE;//获取资源的大小DWORD dwSize = SizeofResource(NULL, hRsrc);if (0 == dwSize)return FALSE;//加载资源HGLOBAL hGlobal = LoadResource(NULL, hRsrc);if (NULL == hGlobal)return FALSE;//锁定资源LPVOID pBuffer = LockResource(hGlobal);if (NULL == pBuffer)return FALSE;//我们用刚才得到的pBuffer和dwSize来做一些需要的事情。可以直接在内存中使//用,也可以写入到硬盘文件。这里我们简单的写入到硬盘文件,如果我们的自定//义资源是作为嵌入DLL来应用,情况可能要复杂一些。BOOL bRt = FALSE;FILE* fp = _tfopen(_T("demo.exe"), _T("wb"));if (fp != NULL){if (dwSize == fwrite(pBuffer, sizeof(char), dwSize, fp))bRt = TRUE;fclose(fp);}  //FreeResource(hGlobal);return bRt;

使用实例

功能:寻找软件中的资源(type:HELP_FILE,  Id:IDR_HELP_FILE1),并在本地临时文件夹temp中生成对应资源的文件(涉及查找资源中文件、加载资源到内存、得到资源大小、将资源内存写入文件),并打开文件

</pre><p><pre name="code" class="cpp">CString szPath, szDir;
TCHAR buf[MAX_PATH];
szPath.Empty();
szDir.Empty();GetTempPath(MAX_PATH, buf);
szDir = buf;
szPath = szDir + _T("Help.pdf");if (GFun::ReleaseRes(szPath, (WORD)IDR_HELP_FILE1, _T("HELP_FILE")) == TRUE)
{ShellExecute(NULL, _T("OPEN"), szPath, NULL, szDir, SW_SHOWNORMAL);
}bool ReleaseRes(CString strFileName, WORD wResID, CString strFileType)
{// 资源大小    DWORD   dwWrite = 0;// 创建文件    HANDLE  hFile = CreateFile(strFileName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);if (hFile == INVALID_HANDLE_VALUE){return false;}// 查找资源文件中、加载资源到内存、得到资源大小    HRSRC   hrsc = FindResource(NULL, MAKEINTRESOURCE(wResID), strFileType);HGLOBAL hG = LoadResource(NULL, hrsc);DWORD   dwSize = SizeofResource(NULL, hrsc);// 写入文件    WriteFile(hFile, hG, dwSize, &dwWrite, NULL);CloseHandle(hFile);return true;
}

说明:

1、GetTempPath的功能是获取系统当前用户的临时文件夹路径,如:C:\Users\XXX\AppData\Local\Temp

2、ShellExecute的功能是运行一个外部程序(或者是打开一个已注册的文件、打开一个目录、打印一个文件等等),并对外部程序有一定的控制。

VC中使用自定义资源相关推荐

  1. vc中载入flash资源

    1.工程区的 resource树中,鼠标右键->import, 2.选择 *.swf文件: 3.Resource type 里输入 "SWF",包括双引号: 4.swf被以二 ...

  2. aws cloudformation 理解自定义资源的使用

    资料 AWS::CloudFormation::CustomResource cfn-response module 自定义资源的逻辑 cloudformation只能对aws service进行部署 ...

  3. WPF 如何在代码中使用自定义的鼠标资源

    如果想要在XAML中使用自定义鼠标很容易,直接在标签中设定 Cursor="/asserts/hand.ani" 即可, 但是如果在代码中使用需要 this.Cursor = ne ...

  4. VB将自定义资源中的文件释放出来

    程序代码: Option Explicit '************************************************************************* '** ...

  5. VC中自定义IE浏览器

    VC中自定义IE浏览器 http://www.5xsoft.com/Article.aspx?id=155 本教程提供了自定义浏览器控件的行为和外观的一些方法.你将看到高级的宿主接口, IDocHos ...

  6. VC中自定义打印调试信息函数,打印调试信息到DebugView上

    该文档参考了以下网友的文章,在此表示感谢. 1. (更新)OutputDebugString函数简单封装,实现格式化打印输出(VC++) 链接:http://blog.csdn.net/sunflov ...

  7. VC中的宏 (#define) 与预处理 (#if/#ifdef/#pragma) 的使用方法总结。

    C/C++ 预定义宏 例子:C/C++ 预定义宏的取值 C/C++ 预定义宏用途:诊断与调试输出 CRT 的诊断与调试输出:assert, _ASSERT/_ASSERTE, _RPTn/_RPTFn ...

  8. [转]ToolTip在VC中的使用

    按照下面的步骤去做:  1.先为static设置一个ID,如ID_TIP;  2.在CDialogBar的头文件中的AFX_MSG内加入一行申明  afx_msg BOOL OnToolTip(UIN ...

  9. VC++中使用使用winnet类获取网页内容

    2005-09-01 VC++中使用使用winnet类获取网页内容 - [VC专栏] 微软提供的Winnet类是一个应用层的网络通信组件, 它可以使你的应用程序很容易的实现http.ftp.gophe ...

最新文章

  1. UnicodeEncodeError\: gbk codec cant encode character \\xa1 in position 9699的解决办法
  2. Oracle下绝对文件号和相对文件号区别
  3. 运行Google CTemplate首页的例子遇到_CrtIsValidHeapPointer异常
  4. asp语言与php语言的差别,用什么语言进行网页开发最好.php与asp语言的区别
  5. CS294-112 深度强化学习 秋季学期(伯克利)NO.17 Meta-learning and parallelism
  6. .NET6之MiniAPI(十六):数据保护
  7. java和python的优势_Java和Python哪个更好?解读Python对比其他语言的优势
  8. go ssh 执行多个命令_Gox语言中通过SSH远程执行命令及上传下载文件-GX10
  9. java调用libreoffice_使用Open / LibreOffice开始使用UNO和Java
  10. x264编码参数大测试:05 subme与crf(g)
  11. 「leetcode」450. 删除二叉搜索树中的节点:【递归】【迭代】详解
  12. 《数据虚拟化:商务智能系统的数据架构与管理》一 1.8 数据虚拟化的不同实现...
  13. 操作系统:进程同步与互斥之生产者-消费者问题(含报告和源码)
  14. Java设计模式超详细
  15. 程序员有多喜欢树莓派?这7个开发套件让他们爱不释手!
  16. 计算机应用基础2011,2011统计师计算机应用基础:计算机概述
  17. Mysql中一千万条数据怎么快速查询
  18. 北京电大c语言实验作业二,大学大一c语言程序设计实验室上机题全部代码答案(实验报告).doc...
  19. icpc 北京赛区总结
  20. android 人脸识别demo,Android Camera 内置人脸识别的Demo

热门文章

  1. Java---一周总结 4.2 争强时间管理,防止进入时间黑洞
  2. c#正则提取括号中的字符
  3. 计算机系统实验:二进制炸弹+缓冲区炸弹 (自我学习笔记)
  4. HDA codec相关(2) - verbtable相关
  5. 计算机网络原理选择题
  6. Python学习之魔法方法
  7. 企业如何借助第三方平台订立电子劳动合同?
  8. 开源服务器监控工具——zabbix(一)
  9. zenly安卓_zenly安卓app下载-zenly安卓app下载最新版 v3.26.0
  10. 云服务器、个人服务器、软路由、NAS的奇特用法(一)you-get下载视频 以b站为例(可支持网易云音乐、acfun、土豆、优酷等详情见附录)