duilib將資原始檔壓縮成zip並打包到exe的資源中
本文參考了redrain大佬的http://blog.csdn.net/zhuhongshu/article/details/40146239文章。因為原文是基於WinImplBase類的,個人習慣基於CWindowWnd來做。因此額外摘抄一部分並微微調整一下程式碼,以作記錄。
整個程式的開發跟正常的 使用資源目錄+xml+圖片 這種方式流程一樣。也可以先用這種方式來開發,方便開發除錯。
整個開發完成後,就是將資源壓縮為zip,並且合併到exe資源中的操作了。
1.將使用的所有的資原始檔(xml+圖片等)壓縮為res.zip之類的。注意zip中目錄問題。
2.將壓縮好的res.zip放到程式碼目錄下的res資料夾裡。(什麼?沒有這個資料夾?建議自己建立一個,另外放個ico之類的檔案放到資源中,後面新增為程式的圖示也是極好的嘛。)
3.右鍵自己的工程專案->新增->資源->Version,然後雙擊Version;(為什麼先新增一個Version?1.給自己軟體加個版本資訊嘛;2.便於自動生成.rc檔案和resource.h)
4.右鍵資原始檔->新增->匯入,自動打開了檔案選擇框,檔案選擇框右下角切換為所有檔案,選擇res.zip,然點開啟就行了。資源型別填個ZIPRES即可。此時應該是將這個zip資源打開了,自己儲存一下就行了。在VS的左側可以看到res.zip了。(如果不在資原始檔的篩選器下,自己拖動到那下面即可,看著舒服)
5.右鍵自己的.rc檔案即可看到res.zip的路徑和資源ID之類的了,當然resource.h裡面也有對應的巨集了已經。此時將resource.h引入到需要它的地方(比如main.cpp)
6.main.cpp中定義個全域性變數
LPBYTE g_lpResourceZIPBuffer = NULL;
然後在之前設定資源的地方,將
CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath()+_T("\\res"));
之類的程式碼給註釋掉,新增上如下程式碼
//從資源中載入zip HRSRC hResource = ::FindResource(CPaintManagerUI::GetResourceDll(), MAKEINTRESOURCE(IDR_ZIPRES1),_T("ZIPRES")); if( hResource == NULL ) return 0L; DWORD dwSize = 0; HGLOBAL hGlobal = ::LoadResource(CPaintManagerUI::GetResourceDll(), hResource); if( hGlobal == NULL ) { ::FreeResource(hResource); return 0L; } dwSize = ::SizeofResource(CPaintManagerUI::GetResourceDll(), hResource); if( dwSize == 0 ) return 0L; g_lpResourceZIPBuffer = new BYTE[ dwSize ]; if (g_lpResourceZIPBuffer != NULL) { ::CopyMemory(g_lpResourceZIPBuffer, (LPBYTE)::LockResource(hGlobal), dwSize); } ::FreeResource(hResource); CPaintManagerUI::SetResourceZip(g_lpResourceZIPBuffer, dwSize);
OK,完成,自己編譯測試吧。
我的部落格即將搬運同步至騰訊雲+社群,邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=3emuugu928o4c