VC释放EXE资源文件

来源:互联网 发布:开票软件登录 编辑:程序博客网 时间:2024/04/30 23:57

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

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

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

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

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

   

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

   

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

   

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

   res view

 

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

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

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

 

    success