# 编程实现自定义资源释放
# 背景
用VS2013写一个释放资源的小程序,除了自定义的资源外,还可以释放其他类型的资源,只要是程序里的资源,使用这个小程序,都可以实现。
这个小功能可以帮助我们把程序变得更简洁,意思是说,如果你的程序额外需要一些DLL文件、文本文件、图片文件或是其它的音视频文件等等,你都可以把它们作为资源插入到程序里,等到程序运行时,再把它们释放到本地上。这样做的好处便是,你编译出来就只有一个EXE文件,而不需要附带其它的文件,所以程序变得就很简洁。你只需把EXE发送给其他人,而不需要连同其他文件一起发送。
那么,现在把这一程序的实现原理和过程,写成文档,分享给大家。
# 插入资源到程序的步骤
在讲解程序原理之前,先介绍下在使用VS2013开发程序的过程中,如何插入资源到程序里。
我们以名为 “520” 的这个文件为例,进行讲解。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/2d9bf7111370fd3f9a8ec1236d6517fc.writebug)
在工程项目中,选择“添加资源(A)...”。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/48d69060f5dc53f0ddce53e5b9b4015b.writebug)
如果是添加一个现成的资源文件的话,可以选择对应的资源类型。本文演示的是插入自定义资源,所以点击“自定义(C)...”按钮。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/cb207d58d9e630f2f5e1f8b9a9b2fa61.writebug)
然后,在“新建自定义资源”对话框中,输入“资源类型”,如“MYRES”。然后点击“确定”。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/be1eae0502f4190b8ee63b4c8607bcbe.writebug)
然后,我们在“添加资源”对话框里,选择刚才我们新建的“MYRES”资源类型,接着点击“导入(M)...”按钮。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/a1e70d7815a5b4bb66158636b9bae34b.writebug)
选择我们之前新建的 “520” 这个文件,作为资源添加到程序里。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/45a0e865a24133923003eaba06d0890f.writebug)
然后,为 “520” 选择资源类型 “MYRES”,并点击“确定”。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/9c4247dedd72e3864752c35e259554da.writebug)
这样,自定义资源的添加就完成了。现在,我们开始讲解资源释放的原理和实现。
# 主要函数介绍
## FindResource介绍
> 函数声明
>
> ```c++
> HRSRC FindResource(
> HMODULE hModule,
> LPCWSTR lpName,
> LPCWSTR lpType );
> ```
>
> 参数
>
> - hModule:处理包含资源的可执行文件的模块。NULL值则指定模块句柄指向操作系统通常情况下创建最近过程的相关位图文件。
> - lpName:指定资源名称。若想了解更多的信息,请参见注意部分。
> - lpType:指定资源类型。若想了解更多的信息,请参见注意部分。作为标准资源类型。这个参数的含义同EnumResLangProc\lpType。
>
> 返回值
>
> - 如果函数运行成功,那么返回值为指向被指定资源信息块的句柄。为了获得这些资源,将这个句柄传递给LoadResource函数。如果函数运行失败,则返回值为NULL。若想获得更多错误信息,请调用GetLastError函数。
## SizeofResource 介绍
> 函数声明
>
> ```c++
> DWORD SizeofResource(
> HMODULE hModule, // module handle
> HRSRC hResInfo // resource handle
> );
> ```
>
> 参数
>
> - hModule:包合资源的可执行文件模块的句柄。
> - hReslnfo:资源句柄。此句柄必须由函数FindResource或FindResourceEx来创建。
>
> 返回值
>
> - 如果函数运行成功,返回值资源的字节数。如果函数运行失败,返回值为零。若想获得更多的错误信息,请调用GetLastError函数。
## LoadResource 介绍
> 函数声明
>
> ```c++
> HGLOBAL LoadResource(
> HMODULE hModule, // module handle
> HRSRC hResInfo // resource handle
> );
> ```
>
> 参数
>
> - hModule:处理包合资源的可执行文件的模块句柄。若hModule为NULL,系统从当前过程中的模块中装载资源。
> - hReslnfo:将被装载资源的句柄。它必须由函数FindResource或FindResourceEx创建。
>
> 返回值
>
> - 如果函数运行成功,返回值是相关资源的数据的句柄。如果函数运行失败,返回值为NULL。若想获得更多的错误信息,请调用GetLastError函数。
## LockResource 介绍
> 函数声明
>
> ```c++
> LPVOID LockResource(
> HGLOBAL hResData // handle to resource
> );
> ```
>
> 参数
>
> - hResDate:被装载的资源的句柄。函数LoadResource可以返回这个句柄。
>
> 返回值
>
> - 如果被装载的资源被锁住了,返回值是资源第一个字节的指针;否则为NULL。
# 程序实现原理
Windows为方便开发人员获取程序里的资源,提供了一系列操作资源的API函数,所以,我们的程序的实现,也是基于这些API的基础上,进行操作的。
- 首先,我们先定位到我们程序里的资源,主要是根据“资源类型”和“资源名称”进行定位,获取资源信息块的句柄
- 然后,根据上面获取的资源信息块的句柄,把资源加载到我们程序的内存中
- 接着,锁定加载到内存中的资源的内存,防止程序的其他操作影响到这块内存
- 最后,我们根据资源的内存地址以及资源的大小,将资源数据保存成文件
这样,经过上述的5个步骤,便可以定位出资源,并释放到本地磁盘上。
# 程序实现
```c++
BOOL FreeMyResource(UINT uiResouceName, char *lpszResourceType, char *lpszSaveFileName)
{
// 获取指定模块里的指定资源
HRSRC hRsrc = ::FindResource(NULL, MAKEINTRESOURCE(uiResouceName), lpszResourceType);
if (NULL == hRsrc)
{
FreeRes_ShowError("FindResource");
return FALSE;
}
// 获取资源的大小
DWORD dwSize = ::SizeofResource(NULL, hRsrc);
if (0 >= dwSize)
{
FreeRes_ShowError("SizeofResource");
return FALSE;
}
// 将资源加载到内存里
HGLOBAL hGlobal = ::LoadResource(NULL, hRsrc);
if (NULL == hGlobal)
{
FreeRes_ShowError("LoadResource");
return FALSE;
}
// 锁定资源
LPVOID lpVoid = ::LockResource(hGlobal);
if (NULL == lpVoid)
{
FreeRes_ShowError("LockResource");
return FALSE;
}
// 保存资源为文件
FILE *fp = NULL;
fopen_s(&fp, lpszSaveFileName, "wb+");
if (NULL == fp)
{
FreeRes_ShowError("LockResource");
return FALSE;
}
fwrite(lpVoid, sizeof(char), dwSize, fp);
fclose(fp);
return TRUE;
}
```
# 程序测试
我们创建一个MFC工程项目,按照上述步骤,插入资源,并调用封装好的函数,进行释放资源的测试。
其中,调用封装好的释放资源函数部分的代码为:
```c++
void CResourceFree_TestDlg::OnBnClickedButtonRelease()
{
// TODO: 在此添加控件通知处理程序代码
char szSaveName[MAX_PATH] = "520.txt";
// 释放资源
BOOL bRet = FreeMyResource(IDR_MYRES2, "MYRES", szSaveName);
if (FALSE == bRet)
{
::MessageBox(NULL, "Free Resource Error!", "ERROR", MB_OK);
}
else
{
::MessageBox(NULL, "Free Resource OK!", "OK", MB_OK);
}
}
```
测试结果:
当我们点击 “释放” 按钮,释放资源的时候,提示释放成功。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/24b5924d66cc33906db628ab460c8bfe.writebug)
然后,查看目录,本地生成 “520.txt” 文件,打开文件查看内容,与我们之前插入的 “520” 文件的内容相同。所以,资源释放成功。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/c56238db196209f2a5b6105d674f227f.writebug)
# 总结
这个小程序并不是很复杂,只要弄清楚程序的逻辑关系,然后调用相应的API函数进行操作�
没有合适的资源?快使用搜索试试~ 我知道了~
精选_编程实现自定义资源释放_源码打包
共24个文件
h:6个
cpp:4个
ico:2个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 190 浏览量
2022-03-10
13:20:51
上传
评论
收藏 3.33MB ZIP 举报
温馨提示
编程实现自定义资源释放
资源推荐
资源详情
资源评论
收起资源包目录
22106557161788865.zip (24个子文件)
resourcefree-test
src
ResourceFree_Test.sln 975B
ResourceFree_Test.v12.suo 33KB
Debug
ResourceFree_Test.exe 8.88MB
ResourceFree_Test
stdafx.h 1KB
ResourceFree_Test.cpp 2KB
ResourceFree_TestDlg.cpp 3KB
ResourceFree_Test.rc 11KB
ResourceFree_Test.h 478B
ResourceFree.h 462B
ResourceFree_Test.vcxproj 6KB
resource.h 1KB
ResourceFree_TestDlg.h 662B
res
demon64X64.ico 17KB
ResourceFree_Test.rc2 690B
ResourceFree_Test.ico 66KB
520 45B
ReadMe.txt 4KB
ResourceFree_Test.aps 56KB
ResourceFree_Test.vcxproj.filters 2KB
stdafx.cpp 142B
targetver.h 226B
ResourceFree.cpp 5KB
LICENSE 1KB
README.md 8KB
共 24 条
- 1
资源评论
工具盒子
- 粉丝: 60
- 资源: 1313
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 华硕B250 PLUS支持6789代BIOS
- 基于javaScript开发的图书管理系统+数据库+源码+项目展示+开发文档(毕业设计&课程设计&项目开发)
- HTML+CSS制作的个人博客网页 2.zip
- 华硕B250M-PIXIU支持6789代BIOS
- c# winfrom 音量控制 静音
- 【OpenHarmony】 ArkTS 语法基础 ② ( ArkTS 自定义组件 )
- 前言(完整版):.zip
- 基于java开发最受欢迎的电影购票系统+源码+数据库+项目文档+项目展示(毕业设计&课程设计&项目开发)
- 基于STM32输液监测系统-源程序,LABVIEW上位机,HMI串口屏
- ESG评分与企业绩效之间的关系
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功