VC中釋放程式中地資源到檔案
方法一:使用CreateFile和WriteFile
HRSRC res=::FindResource(NULL, MAKEINTRESOURCE(IDR_JPG1), "jpg");
HGLOBAL gl=::LoadResource(NULL,res);
LPVOID lp=::LockResource(gl); // 查詢,載入,鎖定資源
CString strFileName("d:\\Temp.jpg");
CFileFind fFind;
BOOL bExist=fFind.FindFile(strFileName); //判斷檔案是否存在
fFind.Close ();
if(!bExist) //如果檔案不存在則建立
{
HANDLE fp=::CreateFile(strFileName,
GENERIC_WRITE,
FILE_SHARE_READ ,
NULL,
CREATE_NEW, //建立新檔案,如目標檔案已存在則呼叫失敗
0,
NULL);
DWORD aa;
if (!::WriteFile (fp,lp,::SizeofResource(AfxGetResourceHandle(),res),&aa,NULL))
return; //sizeofResource 得到資原始檔的大小
::CloseHandle (fp); //關閉控制代碼
::FreeResource (gl); //釋放記憶體
}
方法2:使用CFile
CString strFileName("d:\\Temp.jpg");
CFileFind fFind;
BOOL bExist=fFind.FindFile(strFileName); //判斷檔案是否存在
fFind.Close ();
if(!bExist)
{
HRSRC hResInfo = ::FindResource(NULL,(LPCSTR)IDR_JPG1,"jpg");
HGLOBAL hRes = ::LoadResource(NULL,hResInfo );
CFile ff;
ff.Open( "temp.jpg", CFile::modeCreate | CFile::modeWrite, NULL))
ff.WriteHuge((LPSTR)hRes, ::SizeofResource(::AfxGetResourceHandle(), hResInfo) ); //寫入檔案
ff.Close();
}
函式說明:
函式原型:HRSRC FindResourceEx(HXODULE hModule,LPCTSTR lpType,LPCTSTR lpName,WORD wLanguage);
函式功能:該函式確定指定模組中指定型別、名稱及語言的資源所在位置。
引數:
hModule:處理包含資源的可執行檔案的模組。如果引數值為NULL,則函式搜尋曾經建立的最近過程的模組。
lpType:指向以NULL為結束符的字串,它指定了被列舉出的資源型別名稱。若要了解更多的資訊,請參見注意部分。作為標準型別,這個引數取值同EnumResLangProc\lpType。
lpName:指向說明資原始檔名稱並以NULL為結束符的字串。若要了解更多的資訊,請參見注意部分。
WLanguage:指明語言資源。若此引數為MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL),則為了指定零一種語言,可以使用巨集建立這個引數。更多的資訊請參見MAKELANGID。
返回值:如果函式執行成功,其返回值是一個指定資源資訊塊的控制代碼。為了獲得資源,要將此控制代碼傳遞給LoadResource函式。如果函式執行失敗,返回值為空。若想獲得更多的錯誤資訊,請呼叫GetLastError函式。
函式原型; HGLOSAL LoadResouare(HMODULE hModule,HRSRC hReslnfo);
函式功能:該函式裝載指定資源到全域性儲存器。
引數:
hModule:處理包合資源的可執行檔案的模組控制代碼。若hModule為NULL,系統從當前過程中的模組中裝載資源。
hReslnfo:將被裝載資源的控制代碼。它必須由函式FirtdResource或FindResourceEx建立。
返回值:如果函式執行成功,返回值是相關資源的資料的控制代碼。如果函式執行失敗,返回值為NULL。若想獲得更多的錯誤資訊,請呼叫GetLastError函式。
注意:LoadResource的返回型別是向後相容的HGLOBAL型,而不是因為函式返回一個全域性儲存塊控制代碼。不要傳遞這個控制代碼給函式GlobalLock或GlobalFree。為了得到更多資源資料資訊,請呼叫LockResource函式。
當使用完資源後,必須通過呼叫函式以釋放加速器表、點陣圖、游標、圖示以及選單所佔的記憶體資源:加速器表:DestroyAcceleratorTable;點陣圖:DeleteObject;游標:DestroyCursor;圖示:Destroylcon;選單:DestroyMenu。
當過程建立終止時,系統將自動刪除這些資源。但是呼叫相關函式也可以保留記憶體減少過程的工作設定所佔空間。
函式功能:該函式鎖定記憶體中的指定資源。
函式原型:LPVOID LockResource(HGLOBAL hResDate);
引數:
hResDate:被裝載的資源的控制代碼。函式LosdResource可以返回這個控制代碼。
返回值:如果被裝載的資源被所住了,返回值是資源第一個位元組的指標;否則為NULL。
注意:通過使用函式FindResource或FindResourceEx返回控制代碼試圖所住資源,不再工作。可以返回一個錯誤的資料和任意資料的指標。
當使用完資源後,必須通過呼叫函式以釋放加速器表、點陣圖、游標、目標以及某單所佔的記憶體資源:加速器表:DestroyAcceleratorTable;點陣圖:DeleteObject;游標:DestroyCursor;圖示:Destroylcon;選單:DestroyMenu。
當過程建立終止時,系統將自動刪除這些資源。但是呼叫相關函式也可以保留記憶體減少過程的工作設定所佔空間。
FreeResource()
函式功能:該函式已過時。它為16位的基於Win32的應用程式提供了一個簡單的埠。對於Win32應用程式(32位)沒有必要釋放用LoadResource函式裝載資源。由LoadResource所獲得的資源隨著被裝載模組的解除安裝自動被釋放。但是,為了保留記憶體減少的程式工作設定所佔空間大小,必須通過呼叫下列表中的函式以釋放加速器表、點陣圖、游標、圖示以及選單所佔的記憶體資源。
加速器表:DestroyAcceleratorTable;點陣圖:DeleteObject;游標:DestroyCursor;
圖示:Destroylcon;選單:DestroyMenu。