EXE中释放文件

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

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

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

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

[cpp] view plaincopyprint?

  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=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测试通过,运行效果如下图:

时间: 2024-10-22 09:00:42

EXE中释放文件的相关文章

exe中嵌入dll和exe中释放dll

BinRes.h ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #ifndef _waxie_binary_resource_h_ #define _waxie_binary_resource_h_ #include <string> class BinRes  { public:     BinRes();     virtual ~BinRes(); public:     static void ExtractBinResour

Linux中删除文件,磁盘空间未释放问题追踪

在客户使用我们产品后,发现一个问题:在删除了文件后,磁盘空间却没有释放.是有进程在打开这个文件,还是其他情况?我们一起来看看一下两个场景 一. 场景一:进程打开此文件 当一个文件正在被一个进程使用时,用户删除此文件,文件只会从目录结构中删除,但并没有从磁盘删除.当使用这个文件的进程结束后,文件才会真正的从磁盘删除,释放占有的空间. 我们发现剩余磁盘空间比较少时,回去删除一些大的临时文件或者log文件,如果删除之后会发现磁盘空间并未减少,那么可以通过"lsof"命令去查看正在使用该文件的

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

三.代码实现(DELPHI版本),采用第三种方式实现代码插入. 1. 定义两个类,一个用来实现在内存中建立输入表:一个用来实现对PE头的代码插入. DelphiCode: const MAX_SECTION_NUM = 20; const DYN_LOADER_START_MAGIC = $C0DE51A9; const DYN_LOADER_END_MAGIC = $C0DEE2DE; const DYN_LOADER_START_DATA1 = $DA1EDA1E; const IMPORT

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

在工程文件夹中有个readme文件,下面是翻译过来的. ======================================================================== MICROSOFT FOUNDATION CLASS LIBRARY : Down1========================================================================微软基础类库 AppWizard has created this D

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

原文:http://www.crifan.com/csharp_call_explorer_to_open_destinate_folder_and_select_specific_file/ C#中调用资源管理器(Explorer.exe)打开指定文件夹 + 并选中指定文件 + 调用(系统默认的播放类)软件(如WMP)打开(播放歌曲等)文件 折腾: C#中如何在右下角添加提示窗口,用于显示打开文件和文件夹 的过程中,需要实现,点击对应LinkLabel后,调用资源管理器,打开对应的文件夹. [

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

在VS2010中编译C#工程时,在C#的Project的属性界面的Build选项卡中当Configuration : Relese 时,依然会生成扩展名为.vhost.exe和.pdb文件. 其中.pdb是debug时使用的debug database文件;.vhost.exe是从VS2005开始的VS host process 不生成.vshost.exe文件的步骤如下图:打开工程属性的Debug标签选项卡,将Configuration选择为Relese , 去掉 Enable the Vis

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

基本原理:Pyinstaller 可以将资源文件一起bundle到exe中,当exe在运行时,会生成一个临时文件夹,程序可通过sys._MEIPASS访问临时文件夹中的资源 官方说明:https://pythonhosted.org/PyInstaller/spec-files.html#spec-file-operation 测试案例功能描述,访问资源文件夹res/a.txt,并打印其内容.实现方法如下: 源码如下,比较简单,resource_path方法说明了如何使用sys._MEIPASS

[转]MSI安装程序中的文件替换

原文链接:http://teach.hanzify.org/article/652-1233562028.html 前言 最近有汉化朋友问起如何不重新制作MSI文件,而直接用汉化好的文件替换MSI安装程序中的文件.为此,将本人的实践经验作个总结,供各位汉化人参考.有错误的地方烦请指正.※说明:目前可以用于MSI编辑的软件很多,但是有些软件在保存时会在MSI文件中写入一些自己的表或内容,有些会另外嵌入一个CAB文件,使得MSI文件增大.而这里提供的方法保证不会写入任何不必要的内容和文件.※关键点:

DICOM:dcmqrscp.exe与storescu.exe中C-STORE服务的差别

背景: 专栏中曾分别写过dcmqrscp.exe与storescu.exe工具包的介绍,但是并未深究两者之间的差别.dcmqrscp.exe工具是一个mini版PACS,可分别响应C-FIND.C-MOVE.C-GET.C-STORE等各种DIMSE服务,而storescu.exe工具是C-STORE服务使用者,可以看出这两个工具包都提供C-STORE SCU服务.前几天博友的一个问题使得重新研究了一下两者在实现C-STORE SCU服务上的差别.通过源码分析发现问题根源出在Presentati