📄 resmng.c
字号:
/****************************************************************************/
/* */
/* Copyright (C) 2005 SHENZHEN MEIJIN CO.LTD */
/* */
/* FILE NAME: ResMng.c */
/* MODULE NAME: 资源管理模块 */
/* DESCRIPTION: 本程序的主要功能是管理系统中的资源 */
/* */
/* FUNCTIONS: */
/* ResMngInitialize 资源管理模块初始化 */
/* ResGetString 得到对应ID号的字符串资源的数据地址和长度*/
/* ResGetIcon 得到对应ID号的位图资源的数据地址和长度 */
/* */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* 谢永良 2005-03-22 创建 */
/****************************************************************************/
// 包含相关的头文件
#include "Base.h"
#include "file.h"
#include "ResMng.h"
#include "Maskrom.h"
#include "iodriver.h"
typedef struct tagRESMNG_DATA_STRUCT
{
UINT uResType;
VOID *pResDataAddr;
} RESMNG_DATA_STRUCT;
// 资源信息表
#ifndef WIN32
const RESMNG_DATA_STRUCT g_caResInfoTable[] =
{
RESTYPE_STRING, 0,//(VOID*)RES_STRING_ADDRESS,
RESTYPE_ICON, 0,//(VOID*)RES_ICON_ADDRESS,
//RESTYPE_HELP, (VOID*)SYSHELP_ADDRESS,
//RESTYPE_MOV, (VOID*)SYSMOVE_ADDRESS,
};
#else
RESMNG_DATA_STRUCT g_caResInfoTable[] =
{
RESTYPE_STRING, 0, //RES_STRING_ADDRESS,
RESTYPE_ICON, 0, //RES_ICON_ADDRESS,
//RESTYPE_HELP, SYSHELP_ADDRESS,
//RESTYPE_MOV, SYSMOVE_ADDRESS,
};
#endif
#ifdef WIN32
#define FILENAME_ICON "A:/ICON.BIN"
#define FILENAME_STRING "A:/STRING.BIN"
#else
#define FILENAME_ICON "C:/RESICONN.BIN"
#define FILENAME_STRING "C:/RESSTRRR.BIN"
#endif
#define CHECK_RESID(id,maxid) (id > 0 && id < maxid)
//#define ICONBUFF_SIZE LCD_SCREEN_WIDTH*LCD_SCREEN_HEIGHT/8
#define ICONBUFF_SIZE 0x4B30 //根据最大资源数据得来,原因待查
HFILE g_hIconFile = -1; // ICON文件的句柄
HFILE g_hStringFile = -1; // String文件的句柄
UINT g_uMaxID_ICON; // 用于判断RESID的正确性
UINT g_uMaxID_STRING; // 用于判断RESID的正确性
UINT8 g_uIconBuff[ICONBUFF_SIZE]; //用于将ICON数据放、放入FLASHROM后,读时用
INT _ResGetResource( HFILE, UINT uID, UINT8 **ppRetAddr );
/****************************************************************************/
/* FUNCTION: BOOL ResMngInitialize(VOID) */
/* DESCRIPTION:资源管理模块初始化 */
/* INPUTS: NONE */
/* OUTPUTS: NONE */
/* RETURN: 初始化成功返回TRUE,否则返回FALSE */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* 谢永良 2005-03-22 创建 */
/****************************************************************************/
BOOL ResMngInitialize(VOID)
{
HFILE f;
#ifdef WIN32
// g_caResInfoTable[0].pResDataAddr = RES_STRING_ADDRESS;
// g_caResInfoTable[1].pResDataAddr = RES_ICON_ADDRESS;
#endif
if (g_hIconFile != -1)
{
return TRUE;
}
if((f = FileOpen(FILENAME_ICON,FILEMODE_READONLY)) >= 0)
{
g_hIconFile = f;
if((f = FileOpen(FILENAME_STRING,FILEMODE_READONLY)) < 0 )
{
FileClose(g_hIconFile);
return FALSE;
}
g_hStringFile = f;
}
else
{
return FALSE;
}
FileSeek(g_hIconFile,0,FILESEEK_BEGIN);
FileRead(g_hIconFile,(char*)&g_uMaxID_ICON,sizeof(UINT));
g_uMaxID_ICON >>= 2;
FileSeek(g_hStringFile,0,FILESEEK_BEGIN);
FileRead(g_hStringFile,(char*)&g_uMaxID_STRING,sizeof(UINT));
g_uMaxID_STRING >>= 2;
return TRUE;
}
/****************************************************************************/
/* FUNCTION: INT ResGetString( UINT uStrID, UINT8 **ppRetAddr ) */
/* DESCRIPTION:得到对应ID号的字符串资源的数据地址和长度 */
/* INPUTS: uStrID - 要获取的字符串资源的ID号 */
/* OUTPUTS: ppRetAddr - 将对应字符串资源的地址通过这里返回 */
/* RETURN: 如果返回正数,则此返回值对应字符串资源的数据长度, */
/* 同时通过*ppRetAddr返回资源数据的地址 */
/* 如果返回0,则表示对应的资源不存在 */
/* 如果返回负数,则此返回值的绝对值表示资源的数据长度, */
/* 同时通过*ppRetAddr返回对应资源的文件名和数据偏移 */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* 谢永良 2005-03-22 创建 */
/****************************************************************************/
INT ResGetString( UINT uStrID, UINT8 **ppRetAddr )
{
if ( !CHECK_RESID(uStrID,g_uMaxID_STRING))
return 0;
return _ResGetResource( g_hStringFile, uStrID, ppRetAddr );
}
/****************************************************************************/
/* FUNCTION: INT ResGetIconSize( UINT uIconID,UINT *pWidth, UINT *pHeight)*/
/* DESCRIPTION:得到对应ID号的位图资源的尺寸 */
/* INPUTS: uIconID - 要获取的位图资源的ID号 */
/* pWidth,pHeight - 用于返回ICON宽度和高度的变量指针 */
/* OUTPUTS: *pWidth,*pHeigth - ICON的宽度和高度信息 */
/* RETURN: 如果返回正数,则此返回值对应位图资源的数据长度, */
/* 如果返回负数,则此返回值的绝对值表示资源的数据长度, */
/* 以上两返回宽度,高度信息
/* 如果返回0,则表示对应的资源不存在 */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* 王旻 2007-04-17 创建 */
/****************************************************************************/
INT ResGetIconSize( UINT uIconID,UINT *pWidth, UINT *pHeight)
{
// 如果用RESGETICON效率有问题,可以考虑用这个函数处理。
return TRUE;
}
/****************************************************************************/
/* FUNCTION: INT ResGetIcon( UUINT uIconID, UINT8 **ppRetAddr ) */
/* DESCRIPTION:得到对应ID号的位图资源的数据地址和长度 */
/* INPUTS: uIconID - 要获取的位图资源的ID号 */
/* OUTPUTS: ppRetAddr - 将对应位图资源的地址通过这里返回 */
/* RETURN: 如果返回正数,则此返回值对应位图资源的数据长度, */
/* 同时通过*ppRetAddr返回资源数据的地址 */
/* 如果返回0,则表示对应的资源不存在 */
/* 如果返回负数,则此返回值的绝对值表示资源的数据长度, */
/* 同时通过*ppRetAddr返回对应资源的文件名和数据偏移 */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* 谢永良 2005-03-22 创建 */
/****************************************************************************/
INT ResGetIcon( UINT uIconID, UINT8 **ppRetAddr )
{
if ( !CHECK_RESID(uIconID,g_uMaxID_ICON))
return 0;
return _ResGetResource( g_hIconFile, uIconID, ppRetAddr );
}
/****************************************************************************/
/* FUNCTION: INT _ResGetResource( HFILE hFile, UINT uID, UINT8 **ppRetAddr ) */
/* DESCRIPTION:得到对应ID号的资源的数据地址和长度 */
/* INPUTS: uID - 要获取的资源的ID号 */
/* OUTPUTS: ppRetAddr - 将对应资源的地址通过这里返回 */
/* RETURN: 如果返回正数,则此返回值对应资源的数据长度, */
/* 同时通过*ppRetAddr返回资源数据的地址 */
/* 如果返回0,则表示对应的资源不存在 */
/* 如果返回负数,则此返回值的绝对值表示资源的数据长度, */
/* 同时通过*ppRetAddr返回对应资源的文件名和数据偏移 */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* 谢永良 2005-03-22 创建 */
/****************************************************************************/
INT _ResGetResource( HFILE hFile, UINT uID, UINT8 **ppRetAddr )
{
UINT nResLen, nOffs;
OPTION preempt_status;
preempt_status = NU_Change_Preemption(NU_NO_PREEMPT);
nResLen = 0;
nOffs = 0;
// 取资源数据地址
FileSeek(hFile, sizeof(UINT)*(uID - 1),FILESEEK_BEGIN);
if (FileRead(hFile,(char*)&nOffs,sizeof(nOffs)) != sizeof(nOffs))
{
nResLen = 0;
goto res_fail;
}
if ( FileRead(hFile,(char*)&nResLen,sizeof(nResLen)) != sizeof(nResLen))
{
nResLen = 0;
goto res_fail;
}
if (nResLen <= nOffs)
{
nResLen = 0;
goto res_fail;
}
nResLen = nResLen - nOffs;
if(nResLen > (UINT)ICONBUFF_SIZE)
{
nResLen = ICONBUFF_SIZE; // something is wrong.
}
FileSeek(hFile, nOffs,FILESEEK_BEGIN);
if ( FileRead(hFile,g_uIconBuff,nResLen) != (INT32)nResLen)
{
nResLen = 0;
goto res_fail;
}
*ppRetAddr = g_uIconBuff;
res_fail:
NU_Change_Preemption(preempt_status);
return nResLen;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -