Win32匯編--使用資源--二進制資源與自定義資源
Win32匯編--使用資源--二進制資源與自定義資源
1、使用二進制資源
DOS的exe文件可以帶一個覆蓋部分,覆蓋部分實際上就是在真正的可執行部分后面附加的數據,然后由程序在運行中打開自身文件并使用這些數據。Win32的可執行文件中除了上面介紹的這些標準類型的資源外,也可以在程序中附帶其他數據,當然方法完全不同——Win32資源中允許用戶自己定義二進制的資源或者自定義格式的資源,資源的內容可以是任何數據,也可以將一個磁盤文件按二進制格式包括進去。
二進制資源的定義格式是:
資源ID REDATA [DISCARDABLE]
BEGIN
數據定義
…
END
也可以用一個磁盤文件當做資源的內容:
資源ID RCDATA [DISCARDABLE] 文件名
在程序中要使用資源的內容時,可以通過以下步驟將資源裝入內存使用:
(1)用FindResource(hInstance, lpName, lpType)查找資源。lpName的值為資源ID,lpType的值為RT_RCDATA,如果找到資源。那么函數返回一個資源信息句柄。
(2)用LoadResource(hInstance, hResInfo)裝入資源。hResInfo是上一步中得到的資源信息句柄,裝入成功的話函數會返回一個資源句柄。
(3)用LckResource(hResData)將資源鎖定到內存中。hResData是上一步得到的資源句柄,函數返回資源裝入的內存地址,程序就可以使用內存中的數據了。
(4)如果想知道裝入資源的大小是多少,可以使用FindResource返回的hResInfo來調用SizeofResource(hInstance, hResInfo)從而得到資源大小。
下面是一個裝入資源ID為ID_MYRES的RCDATA類型資源的例子:
invoke FindResource, hInstance, ID_MYRES, RT_RCDATA ;尋找資源
.if eax
mov hResInfo, eax
invoke SizeofResource, hInstance, eax ;獲取資源尺寸
mov dwResSize, eax
invoke LoadResource, hInstance, hResInfo ;裝入資源
.if eax
invoke LockResource, eax ;鎖定資源
.if eax
mov lpRes, eax
;處理lpRes指向的資源內容
.endif
.endif
.endif
2、使用自定義資源
自定義資源的定義格式比二進制資源更靈活,它和二進制資源的區別在于可以指定資源類別為自定義的名稱:
資源ID 類型ID [DISCARDABLE]
BEGIN
數據定義
…
END
或用一個磁盤文件當做資源的內容:
資源ID 類型ID [DISCARDABLE] 文件名
類型ID可以是大于255的數值(255及以下的數值由Windows使用)或字符串,如可以定義如下:
1000 WAVE “Hello.wav” ;定義類型為“WAVE”,資源ID為1000的資源
1000 TEXT “Readme.txt” ;定義類型為“TEXT”,資源ID為1000的資源
1000 1000 “Test.bin” ;定義類型為1000,資源ID為1000的資源
在程序中使用自定義資源的方法和使用二進制資源類似,唯一的區別是使用FindResource得到hResInfo的參數有些區別,得到hResInfo以后的步驟是一模一樣的。針對上面3句定義,查找資源的方法可以是:
szResType1 db “WAVE”,0
szResType2 db “TEXT”,0
…
invoke FindResource, hInstance, 1000, addr szResType1 ;針對上面第一句
invoke FindResource, hInstance, 1000, addr szResType2 ;針對上面第二句
invoke FindResource, hInstance, 1000, 1000 ;針對上面第三句
在使用完二進制或自定義資源以后,不必使用任何函數去釋放它們,Windows在程序退出的時候會自動將它們釋放。
posted on 2010-09-21 16:16 luqingfei 閱讀(1125) 評論(0) 編輯 收藏 引用 所屬分類: Win32匯編程語言序設計