Windows程式就是單獨的.exe執行文件.但若程式需要讀取文檔才能運行.可以將其與.exe文件一起放置,但這樣就失去保密性.更好處理方法是將文檔編譯進.exe執行文件.這樣執行程式就無需附帶其它文檔.以VC為例:
把資源文檔編譯進.exe執行文件
- 在VC工程目錄創建名為”res”的目錄(其它名都可以)
- 把資源文檔當拷貝進”res”的目錄
- 以文本方式編輯rc文檔,寫入資源文檔的路徑
- name/ID flag path
- 編譯器把所以資源文檔編譯成.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 也可直接使用數字 |
讀取資源文檔示例
- 查找資源FindResource()
- 加載資源LoadResource()
- 獲取文檔的長度SizeofResource()
- 鎖定資源並獲取指針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;
}