通用归档API集 (General Purpose Archive Library) Ver 0.5
有以下几个特点:
1. 采用树形组织数据,提供对树状结构进行访问的API。用单个文件储存所有数据。
2. 载入的开销非常低,只有一个目录区被载入。采用文件映像方式,因此访问数据时的内存是动态分配的,效率很高。
3. Dll提供的所有API都是C风格的,Delphi,CB等亦可使用
4. 源代码公开。用了一点STL,大量用到递归,模仿Win32API进行数据封装。
/**********************************************************
gpa.h 通用归档API集 DLL接口声明
版权所有(C) 2001 WannaPlay
通用归档API集完全自由发放。
任何人都可以没有限制的使用、修改和再发布本代码。
同时作者也没有义务为代码可能对你的应用和系统造
成的任何损害承担责任。
发现任何Bug,缺陷,或有任何意见和建议,请联系作者。
谢谢。
Home Page: http://wannaplay.51.net
eMail: rocks_lee@263.net
***********************************************************/
#ifndef _WANNAJOY_GPA_H_
#define _WANNAJOY_GPA_H_
#include <windows.h>
#ifdef DLL_EXPORTS
#define GPA_API extern "C" __declspec(dllexport)
#else
#define GPA_API extern "C" __declspec(dllimport)
#endif
// 声明通用归档句柄
DECLARE_HANDLE(HGPA);
// 声明文档节点句柄
DECLARE_HANDLE(HNODE);
/**
* 打开一个通用归档文件
* @param szFilename 通用归档文件名
* @return 通用归档句柄
*/
GPA_API HGPA gpa_Open(LPSTR szFilename);
/**
* 关闭一个通用归档文件
* @param hGpa 通用归档句柄
* @return void
*/
GPA_API void gpa_Close(HGPA hGpa);
/**
* 得到通用归档的树形结构的根节点
* @param hGpa 通用归档句柄
* @return 文档根节点
*/
GPA_API HNODE gpa_GetRoot(HGPA hGpa);
/**
* 得到通用归档文件的版本号,低字为主版本号,高字为副版本号
* @param szFilename 通用归档句柄
* @return 版本号
*/
GPA_API DWORD gpa_GetVersion(HGPA hGpa);
/**
* 将以hRoot为根的树形结构保存为通用归档文件
* @param szFilename 通用归档文件名
* @param hRoot 树形结构的根节点
* @return void
*/
GPA_API void gpa_Save(LPSTR szFilename, HNODE hRoot);
/**
* 打印输出以hNode为根的子树,供调试用
* @param hNode 树形文档节点
* @return void
*/
GPA_API void gpa_DumpNode(HNODE hNode);
/**
* 创建一个数据节点。如果hParent不为空,将自动添加到hParent
* 注意:数据不会被拷贝,直到调用gpa_Save
* @param szNodeName 数据节点的字符串名,必须少于15个字符
* @param hParent 父节点,可以为NULL
* @param pData 数据的起始地址,
* @param dwSize 数据的大小(以字节计算)
* @param uFlags 标志,必须为0
* @return 数据节点句柄
*/
GPA_API HNODE gpa_CreateDataNode(LPSTR szNodeName,
HNODE hParent,
LPVOID pData,
DWORD dwSize,
UINT uFlags);
/**
* 创建一个目录节点。如果hParent不为空,将自动添加到hParent
* 只有目录节点才可以添加子节点
* @param szNodeName 数据节点的字符串名,必须少于15个字符
* @param hParent 父节点,可以为NULL
* @param uFlags 标志,必须为0
* @return 目录节点句柄
*/
GPA_API HNODE gpa_CreateDirNode(LPSTR szNodeName,
HNODE hParent,
UINT uFlags);
/**
* 删除一个节点以及以该节点为根的子树
* @param hNode 待删除节点
* @return void
*/
GPA_API void gpa_DeleteNode(HNODE hNode);
/**
* 判断一个节点是否目录节点
* @param hNode 文档节点
* @return 布尔值
*/
GPA_API BOOL gpa_IsDirectory(HNODE hNode);
/**
* 得到一个节点的名字
* @param hNode 文档节点
* @return 节点的名字
*/
GPA_API LPSTR gpa_GetNodeName(HNODE hNode);
/**
* 得到一个节点的子节点数目,不包括子节点的子节点。
* 对于数据节点,返回0
* @param hNode 文档节点
* @return 子节点数目
*/
GPA_API int gpa_GetChildCount(HNODE hNode);
/**
* 向一个目录节点添加一个子节点。
* 如果hParent是数据节点,调用无任何效果
* @param hParent 父节点
* @param hChild 子节点
* @return void
*/
GPA_API void gpa_AddChild(HNODE hParent, HNODE hChild);
/**
* 删除指定的子树
* @param hParent 父节点
* @param szChildName 子树根节点名
* @return void
*/
GPA_API void gpa_RemoveChild(HNODE hParent, LPSTR szChildName);
/**
* 根据字符串名查找子节点。
* @param hParent 待查找的父节点
* @param szChildName 子节点名称
* @return 有给定名称的第一个子节点,不存在则返回NULL
*/
GPA_API HNODE gpa_FindChild(HNODE hParent, LPSTR szChildName);
/**
* 得到指定位置的子节点。
* 节点的排列同gpa_AddChild和gpa_CreateXXXNode的调用顺序相同
* @param hParent 父节点
* @param nIndex 子节点索引
* @return 指定位置的子节点
*/
GPA_API HNODE gpa_GetChildAt(HNODE hParent, int nIndex);
/**
* 得到一个节点的父节点
* @param hNode 文档节点
* @return 该节点的父节点
*/
GPA_API HNODE gpa_GetParent(HNODE hNode);
/**
* 得到一个数据节点的数据的起始地址和大小
* @param ppData 输出参数,将被填充真正的起始地址
* @param pdwSize 输出参数,将被填充为真正的大小
* @return void
*/
GPA_API void gpa_GetContent(HNODE hDataNode,
LPVOID* ppData,
DWORD* pdwSize);
#endif//_WANNAJOY_GPA_H_