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中导入项目后 项目中的中文 ...
随机推荐
- [cdqzds] Challenge4
描述 给一个长为N的数列,有M次操作,每次操作时以下三种之一: (1)修改数列中的一个数 (2)求数列中某连续一段所有数的两两乘积的和 mod 1000000007 (3)求数列中某连续一段所有相邻两 ...
- ava8并发教程:Threads和Executors
原文地址 原文作者:Benjamin Winterberg 译者:张坤 欢迎阅读我的Java8并发教程的第一部分.这份指南将会以简单易懂的代码示例来教给你如何在Java8中进行并发编程.这是一系列教 ...
- [AT2401] [arc072_e] Alice in linear land
题目链接 AtCoder:https://arc072.contest.atcoder.jp/tasks/arc072_c 洛谷:https://www.luogu.org/problemnew/sh ...
- 解题:洛谷2633 Count on a tree
题面 在树上建主席树...... 每个点从父亲那里建过来,最后建出来就是从根到$i$这条链上的主席树,查询的时候一边差分一边查询 ($cmt[u]+cmt[v]-cmt[lca(u,v)]-cmt[a ...
- Hadoop基础-SequenceFile的压缩编解码器
Hadoop基础-SequenceFile的压缩编解码器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Hadoop压缩简介 1>.文件压缩的好处 第一:较少存储文件占用 ...
- [Java] 理解JVM之二:类加载步骤及内存分配
一.类加载器 ClassLoader 能根据需要将 class 文件加载到 JVM 中,它使用双亲委托模型,在加载类的时候会判断如果类未被自己加载过,就优先让父加载器加载.另外在使用 instance ...
- np.isin判断数组元素在另一数组中是否存在
np.isin用法 觉得有用的话,欢迎一起讨论相互学习~Follow Me np.isin(a,b) 用于判定a中的元素在b中是否出现过,如果出现过返回True,否则返回False,最终结果为一个形状 ...
- layoutSubviews何时被调用
layoutSubviews在以下情况下会被调用: 1.init初始化不会触发layoutSubviews 但是是用initWithFrame 进行初始化时,当rect的值不为CGRectZero时, ...
- css选择器 nth-child
html代码: <div> <p>多云转晴</p> <p>多云转晴</p> <p>多云转晴</p> <p> ...
- Shell记录-Shell命令(文件权限)
chmod命令用于改变linux系统文件或目录的访问权限.用它控制文件或目录的访问权限.该命令有两种用法.一种是包含字母和操作符表达式的文字设定法:另一种是包含数字的数字设定法. 1. 命令格式 ch ...