?? resource.c
字號:
/***************************************************************************** ------------ 子系統(tǒng)名稱: 界面資源管理器* RESOURCE.C* ------------ 模塊名稱 : 資源核心管理程序** 包括以下函數(shù):* 1. short NewResource ( PRESOURCE *pprNew, short nCount )* 2. short FreeResource ( short nRESID )** 3. short CreatRESFile ( char * pFileName )* 4. short OpenRESFile ( char *pFileName )* 5. short CloseRESFile ( BOOL nWriteHead )** 6. short LoadResource ( short nRESID, void **ppRES )* 7. short AppendResource ( PRESOURCE prTemp )****************************************************************************/#include "resource.h"/***************************************************************************** 全局變量定義****************************************************************************/FILE * pfRESFile; /* 資源文件指針 */RESFILEHEAD rfhRESFileHead; /* 資源文件頭 */PRESOURCE prRESTable; /* 資源索引表 */char pRESVersion[MAXL_VERTEXT] = /* 標(biāo)準(zhǔn)版本信息 */ "PC-TMCS V1.0 RES\n";/***************************************************************************** 函數(shù)原型: NewResource ( PRESOURCE *prNew, short nCount )** 功 能: 創(chuàng)建 nCount 個(gè)資源索引項(xiàng)** 編程人員: Zhu haibin** 編碼時(shí)間: 1994/09/13** 修改時(shí)間:** 入口參數(shù): PRESOURCE prNew -- 資源項(xiàng)指針** 出口參數(shù): OK 調(diào)用成功* ERR_NOMEMORY 沒有足夠的內(nèi)存** 實(shí)現(xiàn)算法: 調(diào)用 malloc 申請內(nèi)存** 上層調(diào)用:** 下層調(diào)用:****************************************************************************/short NewResource ( PRESOURCE *pprNew, short nCount ){ if ( ( (*pprNew) = (PRESOURCE)malloc ( nCount * sizeof ( RESOURCE ) ) ) == (PRESOURCE)NULL ) return ( ERR_NOMEMORY ); return ( OK );}/***************************************************************************** 函數(shù)原型: FreeResource ( short nRESID )** 功 能: 釋放一個(gè)資源** 編程人員: Zhu haibin** 編碼時(shí)間: 1994/09/13** 修改時(shí)間:** 入口參數(shù): PRESOURCE presTemp -- 資源項(xiàng)指針** 出口參數(shù): OK 調(diào)用成功* ERR_RES_INVALIDID 無效的資源標(biāo)識號** 實(shí)現(xiàn)算法: 1. 查找指定的標(biāo)識號* 2. 釋放所對應(yīng)的資源** 上層調(diào)用:** 下層調(diào)用: FreeMenu* FreeDialog****************************************************************************/short FreeResource ( short nRESID ){ short i; /* 查找指定的標(biāo)識號 */ for ( i = 0; i < rfhRESFileHead.nCount; i++ ) if ( prRESTable[i].nRESID == nRESID ) break; /* 無效的標(biāo)識號 */ if ( i >= rfhRESFileHead.nCount ) return ( ERR_RES_INVALIDID ); if ( prRESTable[i].pRES != (void*)NULL ) { switch ( prRESTable[i].nType ) { case RT_STRTBL : FreeStringTable ( (PSTRTBL)prRESTable[i].pRES ); break; case RT_MENU : FreeMenu ( (PMENU)prRESTable[i].pRES ); break; case RT_DIALOG : FreeDialog ( (PDIALOG)prRESTable[i].pRES ); break; } } return ( OK );}/***************************************************************************** 函數(shù)原型: short CreatRESFile ( char * pFileName )** 功 能: 創(chuàng)建一個(gè)資源文件** 編程人員: Zhu haibin** 編碼時(shí)間: 1994/09/14** 修改時(shí)間:** 入口參數(shù): char *pFileName -- 資源文件名** 出口參數(shù): OK 調(diào)用成功* ERR_CFILE 創(chuàng)建文件錯(cuò)** 實(shí)現(xiàn)算法: 調(diào)用 fopen 創(chuàng)建文件** 上層調(diào)用:** 下層調(diào)用: 無****************************************************************************/short CreatRESFile ( char * pFileName ){ /* 創(chuàng)建文件 */ if ( ( pfRESFile = fopen ( pFileName, "wb" ) ) == (FILE*)NULL ) return ( ERR_CFILE ); /* 拷貝標(biāo)準(zhǔn)版本信息 */ strcpy ( rfhRESFileHead.pVersion, pRESVersion ); rfhRESFileHead.nCount = 0; rfhRESFileHead.nAddNum = 0; /* 寫資源文件頭 */ fseek ( pfRESFile, 0, SEEK_SET ); if ( fwrite ( (void*)&rfhRESFileHead, sizeof ( RESFILEHEAD), 1, pfRESFile ) != 1 ) return ( ERR_WFILE ); return ( OK );}/***************************************************************************** 函數(shù)原型: OpenRESFile ( char *pFileName )** 功 能: 打開一個(gè)已存在的資源文件, 檢查其合法性, 讀入資源索引** 編程人員: Zhu haibin** 編碼時(shí)間: 1994/09/14** 修改時(shí)間:** 入口參數(shù): char *pFileName -- 資源文件名** 出口參數(shù): OK 調(diào)用成功* ERR_OFILE 打開文件失敗* ERR_RFILE 讀文件失敗** 實(shí)現(xiàn)算法: 1. 以只讀方式打開文件* 2. 讀入文件頭并檢查其合法性* 3. 讀入資源索引** 上層調(diào)用:** 下層調(diào)用: NewResource****************************************************************************/short OpenRESFile ( char *pFileName ){ short i; BYTE nAddNum; short nErrorID; /* 打開文件 */ if ( ( pfRESFile = fopen ( pFileName, "rb" ) ) == (FILE*)NULL ) return ( ERR_OFILE ); /* 讀文件頭 */ if ( fread ( (void*)&rfhRESFileHead, sizeof ( RESFILEHEAD ), 1, pfRESFile ) != 1 ) return ( ERR_RFILE ); /* 計(jì)算累加和 */ for ( i = nAddNum = 0; i < sizeof ( RESFILEHEAD ); i++ ) nAddNum += ((BYTE *)&rfhRESFileHead)[i]; /* 非法資源文件 */ if ( nAddNum != 0 ) return ( ERR_RES_INVALIDFILE ); /* 申請資源索引表內(nèi)存 */ if ( NewResource ( &prRESTable, rfhRESFileHead.nCount ) < OK ) return ( ERR_NOMEMORY ); /* 讀資源索引表 */ for ( i = 0; i < rfhRESFileHead.nCount; i++ ) { if ( fread ( (void*)&prRESTable[i], sizeof ( RESOURCE ), 1, pfRESFile ) != 1 ) { nErrorID = ERR_RFILE; break; } fseek ( pfRESFile, prRESTable[i].lNextOffset, SEEK_SET ); } if ( i < rfhRESFileHead.nCount ) return ( nErrorID ); /* 裝入所有字符串表資源 */ LoadStrTblResource (); return ( OK );}/***************************************************************************** 函數(shù)原型: CloseRESFile ( BOOL nWriteHead )** 功 能: 關(guān)閉資源文件** 編程人員: Zhu haibin** 編碼時(shí)間: 1994/09/14** 修改時(shí)間:** 入口參數(shù): BOOL nWriteHead -- 是否需要重新寫入文件頭** 出口參數(shù): OK 調(diào)用成功* ERR_WFILE 寫文件失敗** 實(shí)現(xiàn)算法: 1. 如果要重寫文件頭:* A 調(diào)整文件, 使文件頭部空出文件頭和索引表的空間* B 計(jì)算累加和* C 寫入文件頭* 2. 調(diào)用 fclose 關(guān)閉文件** 上層調(diào)用:** 下層調(diào)用: 無****************************************************************************/short CloseRESFile ( BOOL nWriteHead ){ short i; BYTE nAddNum; /* 如果要寫文件頭 */ if ( nWriteHead ) { /* 計(jì)算累加和 */ rfhRESFileHead.nAddNum = 0; for ( i = nAddNum = 0; i < sizeof ( RESFILEHEAD ) - 1; i++ ) nAddNum += ((BYTE *)&rfhRESFileHead)[i]; rfhRESFileHead.nAddNum = ~nAddNum + 1; /* 寫資源文件頭 */ fseek ( pfRESFile, 0, SEEK_SET ); if ( fwrite ( (void*)&rfhRESFileHead, sizeof ( RESFILEHEAD), 1, pfRESFile ) != 1 ) return ( ERR_WFILE ); } /* 關(guān)閉資源文件 */ fclose ( pfRESFile ); return ( OK );}/***************************************************************************** 函數(shù)原型: LoadResource ( short nRESID, void **ppRES )** 功 能: 從資源文件中讀取標(biāo)識號為 nRESID 的資源** 編程人員: Zhu haibin** 編碼時(shí)間: 1994/09/15** 修改時(shí)間:** 入口參數(shù): short nRESID 資源標(biāo)識號* void **ppRES 資源地址** 出口參數(shù): OK 調(diào)用成功, 資源指針返回在 ppRES 中* ERR_RES_INVALIDID 無效的資源識別號* ERR_RFILE 讀文件失敗* ERR_NOMEMORY 沒有足夠的內(nèi)存** 實(shí)現(xiàn)算法: 1. 在資源索引表中查找指定的識別號 nRESID* 2. 讀出資源** 上層調(diào)用:** 下層調(diào)用: 無****************************************************************************/short LoadResource ( short nRESID, void **ppRES ){ short i; /* 在資源索引表中查找指定標(biāo)識號的資源索引項(xiàng) */ for ( i = 0; i < rfhRESFileHead.nCount; i++ ) if ( prRESTable[i].nRESID == nRESID ) break; if ( i >= rfhRESFileHead.nCount ) return ( ERR_RES_INVALIDID ); switch ( prRESTable[i].nType ) { case RT_MENU : if ( i == 0 ) fseek ( pfRESFile, sizeof (RESFILEHEAD) + sizeof (RESOURCE), SEEK_SET ); else fseek ( pfRESFile, prRESTable[i].lRESOffset, SEEK_SET ); LoadMenu ( (PMENU*)&prRESTable[i].pRES, pfRESFile ) ; break; case RT_DIALOG : if ( i == 0 ) fseek ( pfRESFile, sizeof ( RESFILEHEAD ) + sizeof ( RESOURCE ), SEEK_SET ); else fseek ( pfRESFile, prRESTable[i].lRESOffset, SEEK_SET ); LoadDialog ( (PDIALOG*)&prRESTable[i].pRES, pfRESFile ); break; } (*ppRES) = prRESTable[i].pRES; return ( OK );}/***************************************************************************** 函數(shù)原型: AppendResource ( PRESOURCE prTemp )** 功 能: 向資源文件中追加一個(gè)資源** 編程人員: Zhu haibin** 編碼時(shí)間: 1994/09/15** 修改時(shí)間:** 入口參數(shù): PRESOURCE prTemp -- 資源指針** 出口參數(shù): OK 調(diào)用成功* ERR_WFILE 寫文件失敗** 實(shí)現(xiàn)算法: 1. 寫入資源索引項(xiàng)* 2. 寫入資源數(shù)據(jù)** 上層調(diào)用:** 下層調(diào)用: 無****************************************************************************/short AppendResource ( PRESOURCE prTemp ){ /* 將文件指針移到文件尾 */ fseek ( pfRESFile, 0, SEEK_END ); prTemp->lRESOffset = ftell ( pfRESFile ) + sizeof ( RESOURCE ); switch ( prTemp->nType ) { case RT_STRTBL : prTemp->lNextOffset = prTemp->lRESOffset + StringTableSize ( (PSTRTBL)prTemp->pRES ); if ( fwrite ( prTemp, sizeof ( RESOURCE ), 1, pfRESFile ) != 1 ) return ( ERR_WFILE ); return ( SaveStringTable ( (PSTRTBL)prTemp->pRES, pfRESFile ) ); case RT_MENU : prTemp->lNextOffset = prTemp->lRESOffset + MenuSize ( (PMENU)prTemp->pRES ); if ( fwrite ( prTemp, sizeof ( RESOURCE ), 1, pfRESFile ) != 1 ) return ( ERR_WFILE ); return ( SaveMenu ( (PMENU)prTemp->pRES, pfRESFile ) ); case RT_DIALOG : prTemp->lNextOffset = prTemp->lRESOffset + DialogSize ( (PDIALOG)prTemp->pRES ); if ( fwrite ( prTemp, sizeof ( RESOURCE ), 1, pfRESFile ) != 1 ) return ( ERR_WFILE ); return ( SaveDialog ( (PDIALOG)prTemp->pRES, pfRESFile ) ); } return ( OK );}/***************************************************************************** 函數(shù)原型: LoadStrTblResource ( void )** 功 能: 裝入所有字符串表資源** 編程人員: Zhu haibin** 編碼時(shí)間: 1994/10/05** 修改時(shí)間:** 入口參數(shù): PRESOURCE prTemp -- 資源指針** 出口參數(shù): OK 調(diào)用成功* ERR_WFILE 寫文件失敗** 實(shí)現(xiàn)算法: 1. 寫入資源索引項(xiàng)* 2. 寫入資源數(shù)據(jù)** 上層調(diào)用:** 下層調(diào)用: 無****************************************************************************/short LoadStrTblResource ( void ){ short i; short nCount; unsigned short nBufSize; nCount = nBufSize = nSysStrTblCount = 0; for ( i = 0; i < rfhRESFileHead.nCount; i++ ) { if ( prRESTable[i].nType != RT_STRTBL ) continue; if ( i == 0 ) fseek ( pfRESFile, sizeof (RESFILEHEAD) + sizeof (RESOURCE), SEEK_SET ); else fseek ( pfRESFile, prRESTable[i].lRESOffset, SEEK_SET ); LoadStringTable ( (PSTRTBL*)&prRESTable[i].pRES, pfRESFile ) ; nCount += ((PSTRTBL)prRESTable[i].pRES)->nCount; nBufSize += ((PSTRTBL)prRESTable[i].pRES)->nBufSize; pSysStrTbl[nSysStrTblCount] = (PSTRTBL)prRESTable[i].pRES; nSysStrTblCount ++; } return ( OK );}/***************************************************************************** 函數(shù)原型: LoadString ( short nID, char *pBuf, short nBufSize )** 功 能: 從字符串表資源中取出指定字符串** 編程人員: Zhu haibin** 編碼時(shí)間: 1994/10/05** 修改時(shí)間:** 入口參數(shù): short nID -- 字符串標(biāo)識號* char *pBuf -- 字符串緩沖區(qū)* short nBufSize -- 字符串緩沖區(qū)長度** 出口參數(shù): 總為 OK** 實(shí)現(xiàn)算法:** 上層調(diào)用: FreeResource** 下層調(diào)用: 無****************************************************************************/short LoadString ( short nID, char *pBuf, short nBufSize ){ short i, j; for ( i = 0; i < nSysStrTblCount; i++ ) { for ( j = 0; j < pSysStrTbl[i]->nCount; j ++ ) if ( nID == pSysStrTbl[i]->pStrTblIndex[j].nID ) { fseek ( pfRESFile, pSysStrTbl[i]->lFPos + pSysStrTbl[i]->pStrTblIndex[j].nOffset, SEEK_SET ); if ( nBufSize > pSysStrTbl[i]->pStrTblIndex[j].nLen ) nBufSize = pSysStrTbl[i]->pStrTblIndex[j].nLen; fread ( pBuf, sizeof ( char ), nBufSize, pfRESFile ); pBuf[nBufSize] = 0; return ( nBufSize ); } } return ( FALSE );}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -