標籤: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?
- #include <windows.h>
-
- int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
- {
- MessageBox(NULL,"資源檔釋放執行個體!","測試",MB_OK);
- return 0;
- }
#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?
- 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;
- }
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