原文地址:http://blog.csdn.net/wangningyu/article/details/4378378

今天有个朋友问到VC能否释放多个EXE、DLL或WAV等文件,我便做了个实例给他。

(注意:以下释放资源代码是不受文件扩展名所限制的,你可以释放更多类型文件)

下面是我写了个很方面的函数给大家用!

1、工程A要释放的程序是一个简单的MessageBox,源码如下:

  1. #include <windows.h>
  2. int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
  3. {
  4. MessageBox(NULL,"资源文件释放实例!","测试",MB_OK);
  5. return 0;
  6. }

#include <windows.h>

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
MessageBox(NULL,"资源文件释放实例!","测试",MB_OK);
return 0;
}

编译生成MsgBox.exe,复制到工程B目录。

2、工程B为基于MFC对话框程序,先插入已经存EXE(或DLL)文件到VC资源文件中,如下图:

A、切换到资源视图,在上面单机右键:

B、单击"Import...",找到刚刚工程A编译生成的MsgBox.exe文件:

C、设置导入的资源类型名,这个名称将是该函数的第三个参数,我们取资源类型名为EXE:

D、此时,资源视图中多了一个类型为:EXE,资源ID为:IDR_EXE1,如下图:

E、增加一个按钮,添加响应事件,添加成员函数BOOL ReleaseRes(CString strFileName,WORD wResID,CString strFileType),具体代码如下:

  1. HCURSOR CTestDlg::OnQueryDragIcon()
  2. {
  3. return (HCURSOR) m_hIcon;
  4. }
  5. void CTestDlg::OnBtnRelease()
  6. {
  7. // TODO: Add your control notification handler code here
  8. if(ReleaseRes("Test.exe",(WORD)IDR_EXE1,"EXE"))
  9. MessageBox("释放文件成功!","提示",MB_OK);
  10. else
  11. MessageBox("释放文件失败!","提示",MB_OK);
  12. }
  13. /************************************************************************/
  14. /* 函数说明:释放资源中某类型的文件
  15. /* 参    数:新文件名、资源ID、资源类型
  16. /* 返 回 值:成功返回TRUE,否则返回FALSE
  17. /* By:Koma   2009.07.24 23:30
  18. /************************************************************************/
  19. BOOL CTestDlg::ReleaseRes(CString strFileName,WORD wResID,CString strFileType)
  20. {
  21. // 资源大小
  22. DWORD   dwWrite=0;
  23. // 创建文件
  24. HANDLE  hFile = CreateFile(strFileName, GENERIC_WRITE,FILE_SHARE_WRITE,NULL,
  25. CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
  26. if ( hFile == INVALID_HANDLE_VALUE )
  27. {
  28. return FALSE;
  29. }
  30. // 查找资源文件中、加载资源到内存、得到资源大小
  31. HRSRC   hrsc =  FindResource(NULL, MAKEINTRESOURCE(wResID), strFileType);
  32. HGLOBAL hG = LoadResource(NULL, hrsc);
  33. DWORD   dwSize = SizeofResource( NULL,  hrsc);
  34. // 写入文件
  35. WriteFile(hFile,hG,dwSize,&dwWrite,NULL);
  36. CloseHandle( hFile );
  37. return TRUE;
  38. }

HCURSOR CTestDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}

void CTestDlg::OnBtnRelease()
{
// TODO: Add your control notification handler code here
if(ReleaseRes("Test.exe",(WORD)IDR_EXE1,"EXE"))
MessageBox("释放文件成功!","提示",MB_OK);
else
MessageBox("释放文件失败!","提示",MB_OK);
}

/************************************************************************/
/* 函数说明:释放资源中某类型的文件
/* 参 数:新文件名、资源ID、资源类型
/* 返 回 值:成功返回TRUE,否则返回FALSE
/* By:Koma 2009.07.24 23:30
/************************************************************************/
BOOL CTestDlg::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;
}

3、该函数是可重用类,本程序代码在VC6 + WIN SP3测试通过,运行效果如下图:

4、源码下载地址:

http://download.csdn.net/source/1516859

VC释放EXE资源文件的更多相关文章

  1. vc 国际化的资源文件处理

    MS Windows操作系统是一个世界上广泛使用的操作系统,对于不同语种的国家MS Windows有相应语种的版本.在不同语种的Windows平台上应该运行相应语种的应用程序.也就是说程序的用户界面( ...

  2. Exe资源文件

    在 Win NT/2000/XP/2003 下,有现成的API函数,这些函数在 Win 9x/ME 下不能使用. HANDLE BeginUpdateResource(LPCTSTR pFileNam ...

  3. 如何在Qt资源文件中包含和释放exe等各种类型文件?

    操作系统:Windows 10 X64 企业版 Qt: 5.8.0 QtCreater: 4.2.1 刚刚开始学习Qt,不断遇到困难和挑战,前几天在各个QQ群里询问如何在Qt的资源文件中包含和释放ex ...

  4. 在VC资源文件中加入声音资源

    本文介绍如何在VC资源文件中加入自己的声音资源,使自己的应用程序可以播放声音. 1.首先用文本编辑器(如记事本)打开资源文件(.rc文件) 在最后加入自己的声音资源,如下IDW WAVE " ...

  5. Delphi 中将一些 Dll等生成资源文件打包成一个独立的EXE程序方法步骤

    资源文件一般为扩展名为res的文件,其自带的资源编译工具BRCC32.EXE(位于/Delphi/BIN目录下) 1.编写rc脚本文本 用记事本或其它文本编辑器编写一个扩展名为rc的文件,格式分别为在 ...

  6. 控件注册 - 利用资源文件将dll、ocx打包进exe文件(C#版)

    原文:控件注册 - 利用资源文件将dll.ocx打包进exe文件(C#版) 很多时候自定义或者引用控件都需要注册才能使用,但是如何使要注册的dll或ocx打包到exe中,使用户下载以后看到的只是一个e ...

  7. Pyinstaller如何将资源文件一起打包至exe中

    基本原理:Pyinstaller 可以将资源文件一起bundle到exe中,当exe在运行时,会生成一个临时文件夹,程序可通过sys._MEIPASS访问临时文件夹中的资源 官方说明:https:// ...

  8. Pyinstaller打包: 将资源文件或文件夹打包到最后生成的exe中

    前提:用pyinstaller打包时部分资源文件可以利用qrc转成py文件来读取,但是有部分文件类型不适用. 原理:Pyinstaller 将资源文件一起打包到exe中.当exe运行时,会生成一个临时 ...

  9. 【转】资源文件在Delphi编程中的应用

    段东宁 计亚南 (郴州职业技术学院, 湖南 郴州  423000) 摘要: 资源文件是一种能有效地组织.管理和使用资源的文件形式,在软件开发中有着广泛的应用.本文详细介绍了在Delphi编程中资源文件 ...

随机推荐

  1. 从源码角度深入理解LayoutInflater

    关于LayoutInflater,在开发中经常会遇到,特别是在使用ListView的时候,这个几乎是必不可少.今天我们就一起来探讨LayoutInflater的工作原理. 一般情况下,有两种方式获得一 ...

  2. Java基础知识强化之IO流笔记43:IO流练习之 复制文本文件的 5 种方式案例

     1. 案例分析: 分析: 复制数据,如果我们知道用记事本打开并能够读懂,就用字符流,否则用字节流. 通过该原理,我们知道我们应该采用字符流更方便一些. 而字符流有5种方式,所以做这个题目我们有5种方 ...

  3. (整理)FORM:Oracle EBS客制化Form的菜单栏用法说明

    用户最多可以定义45个form-level的trigger,名称必须为SPECIALn, 其中SPECIAL1 to SPECIAL15属于Tools菜单项,放在“工具”主菜单下. SPECIAL16 ...

  4. Modelsim仿真tcl脚本与wave.do文件

    Modelsim的仿真,如果一直使用图形界面建工程,编译,仿真,一个个加入观察波形的话,未免复杂了一些,尤其是当工程较大,需要观察的信号较多时,下面贴出一些常用的tcl脚本命令和wave.do常用语法 ...

  5. modelsim remote

    远程桌面登陆我的台式机上的账号,然后运行modelsim 出现该问题: Unable to checkout a viewer license necessary for use of the Mod ...

  6. 4柱汉诺塔(zz)

    多柱汉诺塔可以用Frame–Stewart算法来解决. The Frame–Stewart algorithm, giving a presumably optimal solution for fo ...

  7. MVC LINQ中用封装的TSQL通用更新方法

    把TSQL拿出来,做了一个封装,适用的所有表,更新有两种,普通更新和记数更新 看代码:这两个方法是写在DAL里的数据操作基类里的,只有它的子类可以用它,所以用protected做为限制 /// < ...

  8. html-----011--子窗体iframe

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. 2014年9月21日_随笔,jdic,ETL,groovy,Nutz好多东西想学

    (1)老妈十一要回老家,才突然发现买票好难啊.有亲朋很重要 (2)这周我做了什么.jdic,ETL,groovy, Nutz好多东西想学. Nutz开发成员专访.Nutz优酷视频(演讲).Nutz 入 ...

  10. 暑假集训(1)第七弹 -----Oil Deposits(Poj1562)

    Description The GeoSurvComp geologic survey company is responsible for detecting underground oil dep ...