需求描述:
借助一个打包工具,指定源文件 和 目标文件路径,用生成事件的方式,每次在VS编译之前执行,生成资源文件包resourse.g2xp(包含了项目中的所有.png图片和xml等资源文件)。
将资源文件包resourse.g2xp加载到项目中,读取文件数据到内存,方便程序在运行中加载包中的图片等资源。
具体方法:
一、预生成事件
项目 —> 配置属性 —>生成事件 —> 预生成事件—>命令行 :
start $(ProjectDir)\G2XPackage.exe -p $(ProjectDir)\res_pack $(ProjectDir)\res.g2xp
意思是执行 宏定义ProjectDir 目录下的G2XPackage.exe程序,将 宏定义ProjectDir目录下的res_pack文件夹,打包成宏定义 ProjectDir 目录下的resourse.g2xp。
前提是G2XPackage.exe程序要存在,res_pack也要存在。
这样,每次编译之前就会执行预生成事件,生成一个resourse.g2xp文件
二、导入自定义资源文件
资源视图 —>添加资源 —>自定义
输入自己想定义的类型,例如 RESPACK ,点击确认,就会在资源视图上生成响应的类型。
然后选中该类型 —>右键添加资源 —>导入,从弹出的文本选择对话框中选择要加入的文件resourse.g2xp,确定,就会看到在RESPACK目录下多了一个资源文件
PS:我在点了确定之后,RESPACK目录下并没有出现相应的资源文件,后来查看属性,才知道在导入时系统写入的路径出现了错误,修改正确的路径后,资源文件就出现了。
三、获取资源文件内容
BOOL CUDOApp::InitLoadResPackage() { // 读取资源包文件 HRSRC hRsrc = FindResource(NULL, MAKEINTRESOURCE(IDR_RESPACK), "RESPACK"); if (NULL == hRsrc) return FALSE; //获取资源的大小 DWORD dwSize = SizeofResource(NULL, hRsrc); if (0 == dwSize) return FALSE; //加载资源 HGLOBAL hGlobal = LoadResource(NULL, hRsrc); if (NULL == hGlobal) return FALSE; //锁定资源 LPVOID pBuffer = LockResource(hGlobal); if (NULL == pBuffer) return FALSE; // 这里转换为BYTE*,根据自己业务需要,也可转换为其它类型 BYTE* pByte = new BYTE[dwSize + 1]; memcpy(pByte, pBuffer, dwSize); GlobalUnlock(hGlobal); // 读取资源到此结束,后面为业务内容 BOOL bRet = G2XSetBundle(pByte, dwSize, _T("res")); delete[] pByte; pByte = NULL; return TRUE; }