在前面的教程裏,雖然圖片都放到了skin文件夾裏,可是XML卻都在外面,當XML比較多時,就不太好看啦,以下圖:html
因此須要整理一下,將XML也放入skin文件夾,這樣exe的目錄就簡潔多了:web
將XML放入skin文件夾後,代碼也要跟着變化哦,在duilib的Demo裏常常能夠看到以下代碼:函數
(其中SetResourcePath是設置資源的路徑,包括XML和圖片等各類資源;SetResourceZip是指資源都放到ListRes.zip文件裏了。)ui
CPaintManagerUI::SetInstance(hInstance); CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath() + _T("skin")); CPaintManagerUI::SetResourceZip(_T("ListRes.zip"));
而Alberl的教程中一直只有一行代碼 加密
CPaintManagerUI::SetInstance(hInstance);
這是由於WindowImplBase已經將CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath())封裝到內部了,因此無需再調用,不過當咱們將資源路徑設置到skin文件夾時,卻發現SetResourcePath(CPaintManagerUI::GetInstancePath() + _T("skin"));後,程序會崩潰。這是由於須要重載WindowImplBase的GetSkinFolder函數,而且return _T("skin"),不過這就讓那幾個類都不通用了,顯然不是個好方法,所以須要找一個通用的方法,那就是改進WindowImplBase,只需將WindowImplBase::OnCreate函數裏的spa
CDialogBuilder builder; CDuiString strResourcePath=m_PaintManager.GetInstancePath(); strResourcePath+=GetSkinFolder().GetData(); m_PaintManager.SetResourcePath(strResourcePath.GetData());
改爲下面這樣便可:3d
CDialogBuilder builder; CDuiString strResourcePath=m_PaintManager.GetResourcePath(); if (strResourcePath.IsEmpty()) { strResourcePath=m_PaintManager.GetInstancePath(); strResourcePath+=GetSkinFolder().GetData(); } m_PaintManager.SetResourcePath(strResourcePath.GetData());
這樣咱們就能夠像Demo裏那樣直接調用CPaintManagerUI::SetResourcePath函數啦,不過還須要將XML裏面的資源路徑改一下,由於XML裏面的資源都是以skin\XXX.png 這種形式的,而設置了資源路徑到skin文件夾以後,就不須要skin前綴了,所以直接用XXX.png就能夠訪問到skin路徑下的文件。code
而SetResourceZip是將資源壓縮到zip文件裏,有的小夥伴不想讓人發現資源,因而想弄個加密壓縮包,或者把壓縮包分紅幾部分,這樣就不能直接解壓了。固然,還有各類各樣的方法可讓人看不到資源文件。orm
可是Alberl早在《仿迅雷播放器教程 -- 提取exe資源(12)》就告訴了你們一種方法,不只能夠直接提取QQ的rdb文件,還能夠提取迅雷的加密XAR文件,無論是加密的,仍是分紅幾部分的文件,都是能夠快速提取出來的,重要的是,根本不須要一丁點黑客知識,也不須要花時間去研究rdb和XAR的格式,更不須要去破解密碼,直接點擊下鼠標就OK了。htm
因此若是尚未去隱藏資源,可是又想這樣作的小夥伴們,Alberl的建議就是:若是能快速搞定加密和擾亂文件,那就無所謂了,若是不會這些,就不必花時間去弄了,由於阿貓阿狗拿了你的資源也幹不了啥事,而高手的話,你那點小伎倆根本就難不倒他,小公司模仿你的軟件也威脅不了你,大公司也看不上你的軟件,因此從商業的角度,只是浪費時間而已。固然,若是你實在不想共享資源,那就去作吧 ~O(∩_∩)O~