學習筆記之資源操作相關函數
作者:日月明
時間:2010-01-22
最近遇到了這樣個問題:編程實現修改EXE程序的圖標,比如把一個EXE程序圖標改爲pdf、word等圖標。。。。。
問題終於解決了,其中最主要的就是涉及到資源函數的相應操作。故發此文。。。。。。。。。
1、FindResource函數:該函數確定指定模塊中指定類型和名稱的資源所在位置。
HRSRC FindResource(
HMODULE hModule, //資源所在EXE、DLL模塊句柄;
LPCWSTR lpName, //資源名稱
LPCWSTR lpType ); //資源類型
返回值:成功則返回資源句柄,將此句柄傳遞給LoadResource函數。
注意:如果參數lpType或lpName的高字節爲O,那麼其低字節中所給定的資源的類
型或名稱標識說明。另外,這些參數指向以NULL爲終止符的字符串。字符串的第
一個字符是#,後面的字符表示十進制數來表示源類型或名稱的整數標識符。例
如。字符串"#258"表示整數標識符258。
如果用整數標識符替代名稱提交資源,用程序將減少所需的內存容量。
當使用完加速器表,位圖,光標,圖標,或是菜單後,可以通過調用下表所
列舉的函數釋放內存。加速器表:DestroyAcceleratorTable;位圖:
DeleteObject;光標:DestroyCursor;圖標:Destroylcon;菜單DestroyMenu。
當過程創建資源終止時,系統將自動刪除這些資源。然而通過調用適當的函
數可以保留內存,減少過程中工作設置所需的空間大小。
應用程序可以使用FindResource函數去查找任何種類資源,但是這個函數只
有在應用程序併發調用LoadLibray和LockResource函數來存取二進制資源時才被
使用。
如果想立即使用某一資源,應用程序將使用下面詳細資源函數列表中某一函
數去查找裝載所需資源,FormatMessage:裝裁且格式化信息表接口:
LoadAccclerators:裝載加速器表;LoadBltmap:裝載位圖資源;LoadCursor:
裝載光標資源;Loadlcon:裝載圖標資源;
LoadMenu:裝載菜單資源;LoadString:裝載字符串表資源。
例如,應用程序可以使用Loadlcon函數裝載某一圖標以在屏幕上顯示。但是
,如果是裝載某一圖標爲了將它的數據複製到另一個應用程序中,那麼這個應用
程序就應該使用FindResource和LoadResource函數。
字符串資源存儲在由若干部分組成的某區域,每部分有16個字符串。每部分
的字符串是按統一計數方式排列的有序隊形式存儲的。
TheLoadstring函數將從相應的區域中摘取字符串資源。
參數hModule不能爲NULL句柄。
參數lpName不支持ID爲零的資源,即FindResource(h,o,t)不能按預期工
作。
不可能在IpTyPe參數中傳遞RT_ANICURSOR或RT_ANllCON的值。
還有一個類似函數:FindResourceEx函數
HRSRC FindResourceEx(
HMODULE hModule,
LPCTSTR lpType,
LPCTSTR lpName,
WORD wLanguage // 資源語言
);
2、LoadResource函數:加載指定資源到全局內存空間中。
HGLOBAL LoadResource(
HMODULE hModule, // EXE、DLL等可執行文件句柄
HRSRC hResInfo // 資源句柄,可由FindResource函數返回
);
返回值:如果函數運行成功,返回值是相關資源的數據的句柄。
注意:LoadResource的返回類型是向後兼容的HGLOBAL型,而不是因爲函數返回
一個全局存儲塊句柄。不要傳遞這個句柄給函數GlobalLock或GlobalFree。爲了
得到更多資源數據信息,請調用LockResource函數。
當使用完資源後,必須通過調用函數以釋放加速器表、位圖、光標、圖標以
及菜單所佔的內存資源:加速器表:DestroyAcceleratorTable;位圖:
DeleteObject;光標:DestroyCursor;圖標:Destroylcon;菜單:DestroyMenu
。
當過程創建終止時,系統將自動刪除這些資源。但是調用相關函數也可以保
留內存減少過程的工作設置所佔空間。
3、LockResource函數:返回資源在內存中的地址。
LPVOID LockResource(
HGLOBAL hResData // 由LoadResource函數返回
);
返回值:如果被裝載的資源被鎖住了,返回值是資源第一個字節的指針;否則爲
NULL。
注意:通過使用函數FindResource或FindResourceEx返回句柄試圖鎖住資源,不
再工作。可以返回一個錯誤的數據和任意數據的指針。
4、SizeofResource函數:獲取指定資源的大小。
DWORD SizeofResource(
HMODULE hModule, // 包含資源的可執行模塊句柄
HRSRC hResInfo // 資源句柄,由FindResource(Ex)返回
);
返回值:返回資源大小的字節數。
5、BeginUpdateResource函數:返回一個可被UpdateResource函數使用的句柄以
便在一個可執行文件中增加、刪除或替換資源。
HANDLE BeginUpdateResource(
LPCTSTR pFileName, // 被更新資源的32位可執行文件的文件名
BOOL bDeleteExistingResources // 是否刪除現有資源選項
);
返回值:如果此函數運行成功,其值將通過使用UpdateResource和
EndUpdateResource函數返回一個句柄。如果被指定的文件不是一個可執行文件,
或者可執行文件已被裝載,或者文件不存在,或是文件不能被打開寫入時,則返
回值爲空。
6、UpdateResource函數:增加,刪除,或替代某可執行文件中的資源。
BOOL UpdateResource(
HANDLE hUpdate, // 由BeginUpdateResource返回
LPCTSTR lpType, // 資源類型
LPCTSTR lpName, // 資源名稱
WORD wLanguage, // 語言標誌
LPVOID lpData, // 資源數據由LockResource返回
DWORD cbData // 資源數據大小,可由SizeofResource返回
);
返回值:如果函數運行成功,返回值爲非零;如果函數運行失敗,返回值爲零。
注意:應用程序重複使用UpdateResource去改變資源數據。每次UpdateResource
調用都要佔用系統內部的一個增加、刪除、替代的列表,而實際上並沒有將數據
寫到可執行文件中。應用程序必須通過使用EndUpdateResource函數將每次積累的
變化寫入可執行文件中。
7、EndUpdateResource函數:終止在可執行文件中的資源更新。
BOOL EndUpdateResource(
HANDLE hUpdate, // 資源更新句柄,通過BeginUpdateResource函數返回。
BOOL fDiscard // 如果此參數爲TRUE,則在可執行文件中無變化;如果此參
數爲FALSE,則在可執行文件中寫入變化。
);
返回值:如果函數運行成功,並且通過調用UpdateResource函數指定的不斷積聚
的資源修正內容被寫入指定的可執行文件,那麼其返回值爲非零。如果函數運行
失敗,其返回值爲零。
8、EnumResourceNames函數:爲每個指定類型的資源搜尋模塊,並將每個查找到
的資源名稱傳遞給回調函數。
BOOL EnumResourceNames(
HMODULE hModule, // 包含資源的可執行模塊句柄
LPCTSTR lpszType, // 資源類型
ENUMRESNAMEPROC lpEnumFunc, // 回調函數
LONG_PTR lParam // 指定一個申請定義參數值傳遞給響應函數
);
返回值:若函數運行成功,則退回非零值;若函數運行失敗,則退回零值。
注意:函數將連續列舉出資源名稱,直到響應函數返回False值或全部的資源名稱
均被列舉完畢。
9、EnumResNameProc函數:一個用戶定義的和EnumResourceNames函數一起使用的回調函數。
BOOL CALLBACK EnumResNameProc(
HMODULE hModule, // 包含資源的可執行模塊句柄
LPCTSTR lpszType, // 資源類型
LPTSTR lpszName, // 回調函數
LONG_PTR lParam // 指定一個申請定義參數值傳遞給響應函數
);
返回值:此響應函數返回值爲TRUE時將繼續列舉;否則,當返回值爲FALSE時將停止列舉。
注意:應用程序必須通過向EnumResourceNames函數傳遞這個函數的地址來註冊。
10、EnumResourceTypes 函數:資源搜尋模塊並且將它找到的每個資源類型傳遞給用戶定義的回調函數。
BOOL EnumResourceTypes(
HMODULE hModule, // 包含資源的可執行模塊句柄
ENUMRESTYPEPROC lpEnumFunc, // 回調函數
LONG_PTR lParam // 申請一個定義參數值傳遞給響應函數
);
返回值:若函數運行成功,則返回非零值;若函數運行失敗,則返回零值。
注意:函數將連續列舉出資源名稱,直到響應函數返回False值或全部的資源名稱均被列舉完畢。
11、EnumResTyPeProc函數:用戶定義的和EnumResourceTypes函數一起使用的回調函數。
BOOL CALLBACK EnumResTypeProc(
HMODULE hModule, // 包含資源可執行模塊句柄
LPTSTR lpszType, // 資源類型
LONG_PTR lParam // 指定一個申請定義參數值
);
返回值:若響應函數返回TRUE值則繼續列舉;否則,返回FALSE值時將停止列舉。
注意:應用程序必須通過將函數的地址傳遞給EnumResourceTypes函數來註冊。
12、EnumResourceLanguages函數:資源搜索模塊並向回調函數傳遞所搜尋到的每種資源語言。
BOOL EnumResourceLanguages(
HMODULE hModule, // 包含資源的可執行模塊句柄
LPCTSTR lpType, // 資源類型
LPCTSTR lpName, // 資源名稱
ENUMRESLANGPROC lpEnumFunc, // 回調函數
LONG_PTR lParam // 回調定義值參數
);
返回值:若函數運行成功,則返回非零值;若函數運行失敗,則返回零值。
注意:EnumResourceLanguages函數將連續列舉出語言資源,直到響應函數返回False值或全部的語言資源均被列舉完畢。
13、EnumResLangProc函數:用戶定義的和EnumResourceLanguages函數一起使用的回調函數。
BOOL CALLBACK EnumResLangProc(
HANDLE hModule, // 包含資源的可執行模塊句柄
LPCTSTR lpszType, // 資源類型
LPCTSTR lpszName, // 資源名稱
WORD wIDLanguage, // 語言ID
LONG_PTR lParam // 回調定義值參數
);
返回值:此響應函數返回值爲TRUE時將繼續列舉:否則,當返回值爲FALSE時將停止列舉。
注意:應用程序必須通過向EnumResourceLanguages函數傳遞這個函數的地址來註冊。