在前面的教程里,虽然图片都放到了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~