在VC中使用自定義資源,FindResource,LoadResource,LockResource
轉自:http://hi.baidu.com/meng_ling_hui/item/908d0c270f95bcc9a5275ad5
關鍵字:VC 自定義資 源FindResource LoadResource LockResource
一、前言
在VC環境中除了我們所常用的Dialog、Menu和Bitmap等標準資源型別之外,它還支援自定義資源型別(Custom Resource),我們自定義的資源型別能做些什麼呢?呵呵,用處多多。
1. 預設的皮膚壓縮包或語言包。一些支援換膚的軟體特別是一些媒體播放器常常有自定義的皮膚檔案(你可以嘗試將Media Player或千千靜聽等軟體的Skins目錄下的檔案的副檔名改為.zip,然後使用WinZip開啟看一下),但為了防止Skin檔案丟失導致軟體無 法顯示,他們常常會在EXE檔案中內建一套Skin作為預設的皮膚檔案。同樣,一些支援多語言的EXE檔案中存在預設語言包也是這個道理(當然也可以使用 "String Table"資源型別);
2. 做為一些病毒/木馬程式的寄生方式。如果不小心執行了帶有病毒/木馬的程式,它們會在你執行時釋放出病毒/木馬檔案。當然許多病毒是將自身寫入PE檔案頭來實現;
3. 合併EXE與它所需要的DLL檔案。出於某些原因程式作者有時可能需要將DLL檔案嵌入到可執行的EXE檔案中,這可以通過使用自定義資源來實現;
4. 其它需要在程式中播放一個AVI動畫等等,都可以通過將二進位制的資料檔案作為自定義資源加入到可執行檔案中來實現;
二、新增
新增資源時選擇自定義,IDE會為你生成一個新的二進位制資源,然後你就可以將你已經存在的二進位制檔案作為自定義的資源型別匯入到專案中來了。
三、使用
要使用自定義資源,我們可能要用到的幾個API函式有FindResource、LoadResource和LockResource等,這裡每一個函式的返回值分別作為下一個函式的引數,我來簡要介紹一下。
1. FindResource用來在一個指定的模組中定位所指定的資源:
2. HRSRC FindResource(
3. HMODULE hModule, //包含所需資源的模組控制程式碼,如果是程式本身,可以置為NULL
4. LPCTSTR lpName, //可以是資源名稱或資源ID
5. LPCTSTR lpType //資源型別,在這裡也就是我們自己指定的資源型別
6. );
7. LoadResource用來將所指定的資源載入到記憶體當中;
8. HGLOBAL LoadResource(
9. HMODULE hModule, //模組控制程式碼,同上
10. HRSRC hResInfo //需要載入的資源控制程式碼,這裡也就是FindResource的返回值
11. );
12. LockResource用來鎖定記憶體中的資源資料塊,它的返回值也就是我們要使用的直系指向資源資料的記憶體指標;
13. LPVOID LockResource(
14. HGLOBAL hResData //指向記憶體中要鎖定的資源資料塊,這裡也就是LoadResource的返回值
15. );
另外我們還需要用SizeofResource來確定資源的尺寸,我們在操作資源時要用到它。在資源使用完畢後我們不需要使用 UnlockResource和FreeResource來手動地釋放資源,因為它們都是16位Windows遺留下來的,在Win32中,在使用完畢後系統會自動回收。它們的使用很簡單,大致上是這個樣子的:
BOOL UseCustomResource()
{
//定位我們的自定義資源,這裡因為我們是從本模組定位資源,所以將控制程式碼簡單地置為NULL即可
HRSRC hRsrc = Findresource(null, MAKEINTRESOURCE(ITEMID), TEXT("MyType"));
if (NULL == hRsrc)
return FALSE;
//獲取資源的大小
DWORD dwSize = SizeofResource(NULL, hRsrc);
if (0 == dwSize)
return FALSE;
//載入資源
HGLOBAL hGlobal = LoadResource(NULL, hRsrc);
if (NULL == hGlobal)
return FALSE;
//鎖定資源
LPVOID pBuffer = LockResource(hGlobal);
if (NULL == pBuffer)
return FALSE;
//我們用剛才得到的pBuffer和dwSize來做一些需要的事情。可以直接在記憶體中使
//用,也可以寫入到硬碟檔案。這裡我們簡單的寫入到硬碟檔案,如果我們的自定
//義資源是作為嵌入DLL來應用,情況可能要複雜一些。
BOOL bRt = FALSE;
FILE* fp = _tfopen(_T("demo.exe"), _T("wb"));
if (fp != NULL)
{
if (dwSize == fwrite(pBuffer, sizeof(char), dwSize, fp))
bRt = TRUE;
fclose(fp);
}
//FreeResource(hGlobal);
return bRt;
摘自:http://www.uipower.com/shownews2.asp?id=296
相關文章
- VC自定義資源
- 在VC++中建立自定義資料庫類 (轉)C++資料庫
- 使用jQuery在javascript中自定義事件jQueryJavaScript事件
- 在vue中,使用echarts的自定義主題VueEcharts
- VC增加自定義訊息 (轉)
- 在資料庫中自定義外部函式資料庫函式
- BW中自定義資料來源的Delta機制
- 在Laravel 中如何自定義servicesLaravel
- Kubernetes CRDs 自定義資源
- 在.NET 6.0中自定義介面路由路由
- mark 使用commons-pool實現自定義資源池
- Android開發 - 使用自定義介面在新視窗中傳回資料Android
- 在Flutter中使用自定義IconFlutter
- iOS 在 App 中使用自定義字型iOSAPP自定義字型
- Laravel重寫資源路由自定義URLLaravel路由
- 如何用 Kubernetes 自定義資源?
- 在 Admin 中自定義 list_filterFilter
- wpf自定義控制元件新增引用資源控制元件
- 在vue中展示自定義列名的甘特圖Vue
- flutter系列之:在flutter中自定義themesFlutter
- 在Jetbrain IDE中自定義TODO功能AIIDE
- 在echarts中自定義提示框內容Echarts
- 在 React 中建立自定義 Hook 的最佳技巧ReactHook
- 自定義物件池在 Caffeine 框架中實踐物件框架
- 在Vue3中實現自定義指令Vue
- Laravel 中自定義使用者登入的資料表Laravel
- 聊聊自定義SPI如何使用自定義標籤注入到spring容器中Spring
- PHP中的自定義路由使用小結PHP路由
- 自主資料型別:在TVM中啟用自定義資料型別探索資料型別
- FindResource詳解
- 使用 JWT 時,新增自定義資料並在登陸時校驗JWT
- 在Luminar 4中向天空新增自定義物件物件
- 在SSIS中自定義VB.Net指令碼(下)OF指令碼
- SQL Server 中自定義資料型別SQLServer資料型別
- 在UNIX系統中使用自定義功能鍵(轉)
- Flex中利用自定義項提供源在ComboBox下拉選單中顯示不同字型的例子Flex
- 在Openjdk 8 中如何合理使用容器 memory 資源JDK
- Vue中自定義指令Vue