把資料放到exe檔案裡面有很多好處,理由也很多,比如:
等等。這方面的例子也很多,就不細說了。我這裡只說說將一類資源全部打包到乙個壓縮檔案中,然後程式中讀取的方法。
乙個zip壓縮包中,包含了大量的檔案,並且還有多級目錄,我們可以將整個資源全部提取出來,存入到乙個記憶體檔案(buffer)中。
從資源中提取資料到記憶體的方法很簡單,**如下:
bool loadrestomemfile(unsigned int resid, const std::wstring res_type, memfile* memfile)}}
return ret;}
在整個資源檔案提取出來之後,需要將裡面的每個檔案都解析出來,並儲存到乙個對映表中,只有這樣,才能保證在給出檔名稱後,快速定位到該檔案的記憶體。
這時需要定義好乙個資料型別:
typedef std::pairkresinfo;
typedef std::mapkresoffset;
kresinfo中的兩個值,分別為偏移位置和檔案長度。如果使用zip壓縮的資源,使用下面的**快速建立對映表:
m_prespackdata = unzopen2((const char*)&m_memzipres, &zip_funcs);
nretcode = unzgotofirstfile(m_prespackdata);
while (unz_ok == nretcode)
unzclose(m_prespackdata);
對映表建立好之後,就可以快速的從裡面取出一段檔案的buffer內容了:
bool getdatafromres(
const std::wstring& filepath,
void** ppbuffer,
unsigned long& dwsize)}
if (!retval)}}
return retval;}
這個裡面要注意的是,記憶體需要由外部釋放。對於zip壓縮程式來說,它裡面使用的檔名全部是「/」,而windows裡面檔名為「\」,因此需要做轉換,這個轉換函式就是:
void formatfilepath(std::wstring & filepath)
else}}
從Jar檔案裡面讀取檔案
我們知道,當jar放入classpath中時,可以通過getresourceasstream來取到其包含的普通檔案,比如a包下有個b.txt檔案,呼叫類叫someclass,於是可以如下取到 someclass.getclass getresourceasstream a b.txt 但是有時候這個...
把exe裡面的資源通通取出來
一 前言 不知大家用過exescope沒有,那是日本鬼子寫的乙個很有用的東西,它能把exe等pe格式 portable executable 檔案的資源 圖示 位圖 對話方塊 聲音等等 分析出來,並能改寫回去。當然vc的ide也有類似功能。大家是不是覺得很神秘?其實只要弄清了pe檔案的結構,你也可以...
從framework裡面讀資源檔案
這是framework內部的資源,跟其他都沒有關係。但是framework不能單獨存在,必須要放在某個 主程式 中才能起作用。bundle引數如果不傳,那麼預設是mainbundle,這種情況路徑就不對了。這種情況下,可以用下面這個api來獲得bundle引數。nsbundle bundleforc...