VC释放EXE资源文件

原文地址: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、切换到资源视图,在上面单机右键:

VC释放EXE资源文件

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

VC释放EXE资源文件

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

VC释放EXE资源文件

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

VC释放EXE资源文件

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

VC释放EXE资源文件

4、源码下载地址:

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

上一篇:property attribute: assign, strong, weak, unsafe_unretain and copy


下一篇:C# MVC 自学笔记—2 MVC Movie简介