今天有个朋友问到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),具体代码如下:

void CMy2Dlg::OnBnClickedButton1()
{
// TODO: Add your control notification handler code here
if(ReleaseRes(L"c:\\111.dll",(WORD)IDR_DLL1,L"DLL"))
MessageBox(L"释放文件成功!",L"提示",MB_OK);
else
MessageBox(L"释放文件失败!",L"提示",MB_OK);
} /************************************************************************/
/* 函数说明:释放资源中某类型的文件
/* 参 数:新文件名、资源ID、资源类型
/* 返 回 值:成功返回TRUE,否则返回FALSE
/* By:Koma 2009.07.24 23:30
/************************************************************************/
BOOL CMy2Dlg::ReleaseRes(CString strFileName,WORD wResID,CString strFileType)
{
// 资源大小
DWORD dwWrite=; // 创建文件
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测试通过,运行效果如下图:

EXE中释放文件的更多相关文章

  1. EXE中释放DLL中分配的内存

    在DLL中分配的内存,如果到其调用者中释放,可能会出现CRASH的情况,其原因在于: 在DLL中的Code Generation如果是采用了MT(静态加载LIBCRTD.LIB)在该库中维护了一个al ...

  2. 其原因可能是堆被损坏,这说明**.exe中或它加载的任何DLL中有Bug

    最近在写一个写日志文件的线程时,调用了HeapAlloc/HeapFree 申请/释放堆缓冲内存.调用HeapFree释放有个条件就是,日志的空闲缓冲队列中内存块超过100个.在测试的时候,发现调用H ...

  3. [转]C#中调用资源管理器(Explorer.exe)打开指定文件夹 + 并选中指定文件 + 调用(系统默认的播放类)软件(如WMP)打开(播放歌曲等)文件

    原文:http://www.crifan.com/csharp_call_explorer_to_open_destinate_folder_and_select_specific_file/ C#中 ...

  4. 用MT.exe将exe中的manifest文件提取出来和将manifest文件放入exe中

     前一种方法是将manifest文件放入exe中,但是要记得需要在工程中设置 这样的话exe中就不存在manifest了,在debug目录下就会看到相应的manifest文件.后者是将exe中的man ...

  5. PE头的应用---插入代码到EXE或DLL文件中

    三.代码实现(DELPHI版本),采用第三种方式实现代码插入. 1. 定义两个类,一个用来实现在内存中建立输入表:一个用来实现对PE头的代码插入. DelphiCode: const MAX_SECT ...

  6. VS2010中配置C#Project不生成.vhost.exe和.pdb文件的方法

    在VS2010中编译C#工程时,在C#的Project的属性界面的Build选项卡中当Configuration : Relese 时,依然会生成扩展名为.vhost.exe和.pdb文件. 其中.p ...

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

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

  8. 皮肤和DLL和图片等项目文件完全整合到exe中

    C#开发的程序原生界面实在是太丑了,自己又没有美化天赋,所以只能使用皮肤控件了,网上找到了IrisSkin2,包含一个.dll文件和若干ssk后缀的皮肤文件,代码其实很简单的.但是后来发现个问题,就是 ...

  9. MFC【exe】工程中的文件大致信息(翻译的)

    在工程文件夹中有个readme文件,下面是翻译过来的. ======================================================================== ...

随机推荐

  1. 拖拽碰撞--原声js(自身理解上新的方法)

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  2. Android Gradle实用技巧——多渠道打包

    友盟有很多不错的功能,例如渠道统计等. 想要做渠道统计,有一个要求就是要在manifest文件中添加各个渠道的配置.只有一两个渠道还好说,但是渠道多了的话,手动修改然后打包简直是噩梦. 幸好现在And ...

  3. QT之实现程序启动画面

    现在好多软件都有,尤其是大型软件,他们要加载的东西太多,因此需要的事件较长,而又不希望给用户产生成为好像没有响应的情况,因此也就需要程序启动画面来实现. 当然了,用widget要比这个丰富很多,不过代 ...

  4. c# WMI获取机器硬件信息(硬盘,cpu,内存等)

    using System; using System.Collections.Generic; using System.Globalization; using System.Management; ...

  5. C++学习37 string字符串的访问和拼接

    访问字符串中的字符 string 字符串也可以像字符串数组一样按照下标来访问其中的每一个字符.string 字符串的起始下标仍是从 0 开始.请看下面的代码: #include <iostrea ...

  6. 中文系统下,UTF-8编码文本文件读取导致的错误

    一.UTF-8编码文件读取导致的错误 有个txt文件,里面内容为: aaa bbb ccc 以UTF-8编码方式打开txt文件,顺序读取,将里面的值放到一个hashset中,并判断aaa是否在在has ...

  7. Js 时间与字符串转示例

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  8. POJ 2096 【期望DP】

    题意: 有n种选择,每种选择对应m种状态.每种选择发生的概率相等,每种选择中对应的每种状态发生的概率相等. 求n种选择和m种状态中每种至少发生一次的期望. 期望DP好别扭啊.要用倒推的方法. dp[i ...

  9. C++primer 练习10.16

    // 10.3.2.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  10. [HDU 2126] Buy the souvenirs (动态规划)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2126 题意:给你n个物品,m元钱,问你最多能买个多少物品,并且有多少种解决方案. 一开始想到的是,先解 ...