從Exe裡面讀取資源,給exe增加嵌入字型

2021-06-21 23:48:34 字數 1112 閱讀 4100

把資料放到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...