看到好多朋友需要这样的功能,便整理了一下写成一个函数,以便后续使用~~
这个函数是可重复使用的代码,以下释放资源代码是不受文件扩展名所限制的,你可以释放更多类型文件,比如DLL、SYS、TXT、WAV等等......
1、工程A
释放的程序是一个简单的MessageBox,源码如下:
- #include <windows.h>
- int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
- {
- MessageBox(NULL,"资源文件释放实例!","测试",MB_OK);
- return 0;
- }
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 CReleaseResFileDlg::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 CReleaseResFileDlg::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 );
- // 启动EXE或COPY等后续操作省略
- // ......
- return TRUE;
- }
3、相关说明
该函数是可重用类,本程序代码在VC6 + WIN SP3测试通过,运行效果如下图:
4、示例代码:
Souce_Demo.rar (34.85 KB)