1. 程式人生 > >VC中釋放程式中地資源到檔案

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。