MFC将二进制文件导入资源后释放
1、前言
前一篇笔记记录了怎么修改PE,此篇记录下如何利用自身的资源文件。
2、编程思路
获得资源句柄 - 获得资源文件大小 - 加载资源文件 - 锁定资源并获得其指针。
3、实践代码
1)编译以下代码将EXE作为资源导入到MFC的资源。
- 服务端
声明三个已经初始化值的变量
// URL配置器.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "stdafx.h"
int main(int argc, char* argv[])
{
TCHAR szIpAddress[] = L"AAAAAAAAAAAAAAAAAAAAAAAAAAAA"; // IP地址
TCHAR szPort[] = L"BBBBBBBBBBBBBBBBBBBBBBBBBBBB"; // 端口号
TCHAR szOtherInfo[] = L"CCCCCCCCCCCCCCCCCCCCCCCCCCCC"; // 其他信息
printf("IP:%ls\nPort:%ls\nOther Information:%ls\n", szIpAddress, szPort, szOtherInfo); // 打印信息
getchar();
return 0;
}

2)来到代码编辑区,我们在需要使用这个exe文件的时候,从资源里拿出这段二进制代码,写入内存或一个磁盘文件就行了。首先定位我们的资源文件,其中IDR_RCEXE即为资源文件的ID:
HRSRC hRsrc = FindResource(NULL, MAKEINTRESOURCEA(IDR_EXE1), TEXT("EXE"));
3)获得资源文件大小,这个大小之后我们如果要提取出来会用到的:
DWORD dwSize = SizeofResource(NULL, hRsrc);
4)加载资源,使用之前获得的资源文件句柄hRsrc:
HGLOBAL hGlobal = LoadResource(NULL, hRsrc);
5)在内存中锁定资源,其返回值即为一个指向资源第一个字节的指针:
LPVOID pBuffer = LockResource(hGlobal);
6)部分代码
void CMFC配置端Dlg::OnBnChangeResource()
{
// TODO: 在此添加控件通知处理程序代码
TCHAR chPath[MAX_PATH]; // 配置文件路径
HANDLE hFile; //释放资源到某个文件中
BOOL bRet = false; // 打开状态标志
// 获得资源句柄
HRSRC hRsrc = FindResource(NULL, MAKEINTRESOURCE(IDR_EXE1), TEXT("EXE"));
// 获得资源文件大小
DWORD dwSize = SizeofResource(NULL, hRsrc);
// 加载资源文件
HGLOBAL hGlobal = LoadResource(NULL, hRsrc);
// 锁定资源并获得指针
LPVOID pBuffer = LockResource(hGlobal);
// 获得要保存的PE文件路径
CFileDialog dlg_NewSavePath(TRUE, _T("exe"), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("可执行文件|*.exe||"), this);
dlg_NewSavePath.m_ofn.lpstrTitle = L"保存的路径.exe";
if (dlg_NewSavePath.DoModal() == IDOK)
{
CString szPE_Path;
szPE_Path = dlg_NewSavePath.GetPathName();
wmemset(chPath, 0, szPE_Path.GetLength() + 1);
wmemcpy(chPath, szPE_Path, szPE_Path.GetLength() + 1);
}
else
{
return;
}
// 新建文件
hFile = CreateFile(chPath, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL);
// 写入文件
bRet = WriteFile(hFile, pBuffer, dwSize, &dwSize, NULL);
if (bRet == 0)
{
return;
}
// 关闭句柄
CloseHandle(hFile);
}
4、效果

5、参考
将二进制文件加入VC资源后释放执行
http://blog.csdn.net/hik_zxw/article/details/51498897
MFC将二进制文件导入资源后释放的更多相关文章
- MFC多国语言——资源副本
此随笔主要参考了http://www.cnblogs.com/xianyunhe/archive/2011/09/02/2163842.html 为软件提供多国语言的支持的具体实现方法有很多,但基本原 ...
- unity3d教程游戏包含的一切文件导入资源
http://www.58player.com/blog-2327-954.html 导入资源 将文件增加至工程文件夹的资源 (Assets) 文件夹后,Unity 将自动检测文件.将任何资源 (As ...
- VC6.0 导入资源崩溃
等我以后挣钱了一定买正版! 最近学习Win32编程,为了锻炼自己,在网上下载了一个VC6.0作为开发工具,应该是兼容性的问题吧,VC6 经常闹毛病. 今天导入资源的时候VC6出现崩溃的现象. 马上寻求 ...
- redis资源未释放引发的问题
一.redis资源未释放的起因: N年前,在修改一个古老程序时,不小心把redis释放的这块给干掉了, if (jedis != null) { if (!isInProcess) { jedis.d ...
- 使用HttpURLConnection时遇到的资源未释放的问题
http://blog.sina.com.cn/s/blog_56beadc60100j9zu.html 今天自己写了一个压力测试的小程序,同时启100个线程,每个线程都串行地访问应用服务器上的一个j ...
- 图层损坏 E/ArcGIS﹕ The map or layer has been destroyed or recycled. 资源未释放
看到论坛上有个网友和我一样的问题: The map or layer has been destroyed or recyled t Hello, I have a problem when the ...
- c# winform中窗体切换后释放及防止重复生成
问题1:窗体切换后如何关闭,并释放资? c# winform中,2个窗体,form1和form2,互相切换的时候执行 this.Hide(); Form2 form2 = new Form2(); f ...
- robot framework 导入资源
创建资源后添加关键字 创建资源文件用于存放关键字,项目下的所有套件都可以引用. 1.创建资源 测试项目->new resource->输入资源名称->点击"确认" ...
- eclipse中导入项目后中文成乱码解决办法
转自:http://blog.163.com/lang_zi_ming/blog/static/1140161762010412112650774/ 编程时在往eclipse中导入项目后 项目中的中文 ...
随机推荐
- contextmap相当于session之类的 用于设置属性 投放到页面上 contextmap的数据存储在map中
contextmap相当于session之类的 用于设置属性 投放到页面上
- Day22-Django之缓存
由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5 ...
- java10 新特性 详解
引言: 点击-->java9 新特性 详解 点击-->java8 新特性 详解 正题: 1.局部变量var 将前端思想var关键字引入java后段,自动检测所属于类型,一种情况除外,不能为 ...
- AtCoder Grand Contest 005
AtCoder Grand Contest 005 A - STring 翻译 给定一个只包含\(ST\)的字符串,如果出现了连续的\(ST\),就把他删去,然后所有位置前移.问最后剩下的串长. 题解 ...
- 【BZOJ1499】【NOI2005】瑰丽华尔兹(动态规划)
[BZOJ1499]瑰丽华尔兹(动态规划) 题面 BZOJ 题解 先写部分分 设\(f[t][i][j]\)表示当前在\(t\)时刻,位置在\(i,j\)时走的最多的步数 这样子每一步要么停要么走 时 ...
- springboot项目添加jsp支持
一.创建springboot项目 使用 http://start.spring.io/ 快速创建一个springboot项目下载并导入 二.添加依赖 在pom.xml中添加支持jsp的依赖如下: &l ...
- Android studio gradle配置完整版(转)
Android studio gradle配置完整版https://my.oschina.net/u/1471093/blog/539075 Android studio 自定义打包apk名 - pe ...
- 使用 swoole 加速你的 laravel
在此前的另外一篇文章讨论过 opcache:php 性能优化之opcache - 让你的php性能提升 50% 再来复习一下吧,导致 php 慢的各种因素中解析性语言的特性可以说是罪魁祸首,再加上,每 ...
- bzoj 1798 线段树
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 7163 Solved: 2587[Submit ...
- DNS系统的解析原理
根据网络通讯原理,对于Router设备是通过IP地址进行路径的Forward:当通过域名(主机名)访问远程主机时,必须将相应的主机名解析为IP地址,DNS服务器就充当了这个角色. DNS的工作原理: ...