VC釋放EXE資源檔

來源:互聯網
上載者:User

標籤:style   blog   http   color   os   strong   io   檔案   

原文地址:http://blog.csdn.net/wangningyu/article/details/4378378

今天有個朋友問到VC能否釋放多個EXE、DLL或WAV等檔案,我便做了個執行個體給他。

 

(注意:以下釋放資原始碼是不受副檔名所限制的,你可以釋放更多類型檔案)

 

下面是我寫了個很方面的函數給大家用!

 

1、工程A要釋放的程式是一個簡單的MessageBox,源碼如下:

 

[cpp] view plaincopyprint?
  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. }  

#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),具體代碼如下: 

 

[cpp] view plaincopyprint?
  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. }  

HCURSOR CTestDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}void CTestDlg::OnBtnRelease() {// TODO: Add your control notification handler code hereif(ReleaseRes("Test.exe",(WORD)IDR_EXE1,"EXE"))MessageBox("釋放檔案成功!","提示",MB_OK);elseMessageBox("釋放檔案失敗!","提示",MB_OK);}/************************************************************************//* 函數說明:釋放資源中某類型的檔案 /* 參 數:新檔案名稱、資源ID、資源類型 /* 返 回 值:成功返回TRUE,否則返回FALSE /* By:Koma 2009.07.24 23:30 /************************************************************************/BOOL CTestDlg::ReleaseRes(CString strFileName,WORD wResID,CString strFileType){// 資源大小DWORDdwWrite=0;// 建立檔案HANDLEhFile = CreateFile(strFileName, GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);if ( hFile == INVALID_HANDLE_VALUE ){return FALSE;}// 尋找資源檔中、載入資源到記憶體、得到資源大小HRSRChrsc = FindResource(NULL, MAKEINTRESOURCE(wResID), strFileType);HGLOBAL hG = LoadResource(NULL, hrsc);DWORDdwSize = SizeofResource( NULL, hrsc);// 寫入檔案WriteFile(hFile,hG,dwSize,&dwWrite,NULL); CloseHandle( hFile );return TRUE;}

 

 

 

3、該函數是可重用類,本程式碼在VC6 + WIN SP3測試通過,運行效果如:

 

 

 

 

 

4、源碼:

 

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.