1. 程式人生 > >duilib將資原始檔壓縮成zip並打包到exe的資源中

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