Windows資源文檔的編譯與讀取

Windows資源文檔的編譯與讀取

Windows程式就是單獨的.exe執行文件.但若程式需要讀取文檔才能運行.可以將其與.exe文件一起放置,但這樣就失去保密性.更好處理方法是將文檔編譯進.exe執行文件.這樣執行程式就無需附帶其它文檔.以VC為例:

把資源文檔編譯進.exe執行文件

  1. 在VC工程目錄創建名為”res”的目錄(其它名都可以)
  2. 把資源文檔當拷貝進”res”的目錄
  3. 以文本方式編輯rc文檔,寫入資源文檔的路徑
  4. name/ID flag   path
  5. 編譯器把所以資源文檔編譯成.RES文檔,最後與其它.obj文檔連接並生.exe執行文件
定義資源文檔 簡介
resources.rc

Heightmap  RAW  “res\\heightmap.raw”

通過字符串名定義

RAW為類型名

Heightmap為資源名

resource.h

#define  ID_MAP   1500

resources.rc

ID_MAP  RAW  “res\\heightmap.raw”

通過整數標識符定義

ID_MAP為資源ID

也可直接使用數字

讀取資源文檔示例

  1. 查找資源FindResource()
  2. 加載資源LoadResource()
  3. 獲取文檔的長度SizeofResource()
  4. 鎖定資源並獲取指針LockResource()

C代碼版本

hInstance:程式的實例句柄

filename:資源文檔名

type:類型名

PBYTE Read_RES(HINSTANCE hInstance,char *filename,char * type)

{//  查找資源

HRSRC hRsrc =::FindResource((HMODULE)hInstance,filename,type);

if(hRsrc == NULL)

return false;

//加載資源

HMODULE hGlobal = (HMODULE)::LoadResource((HMODULE)hInstance,hRsrc);

// 獲取文檔的字節長度

int size =::SizeofResource((HMODULE)hInstance,hRsrc);

// 鎖定資源並獲取指針

PBYTE res = (PBYTE) ::LockResource(hGlobal);

// 分配內存空間

PBYTE data = (PBYTE)malloc(size);

// 拷貝數據

memcpy(data,res,size);

if(hGlobal)

FreeResource(hGlobal); // 釋放資源句柄

return data;

}

評論