火山视窗如何引用C++头文h文件跟cpp文件
如题火山视窗如何引用C++头文h文件跟cpp文件,也没个详细教程,请各大佬给下面头文件给个例子
/*
Axia|FilePack
文件包系统总接口
注意:
所有功能都没有考虑多线程应用!!!
*/
#pragma once
namespace AXP
{
/************************************
API函数定义
*************************************/
#ifdef AXP_STATIC_LIB
#define AXP_API
#else
#ifdef AXP_EXPORTS
#define AXP_API __declspec(dllexport)
#else
#define AXP_API __declspec(dllimport)
#endif
#endif
/************************************
预定义
*************************************/
class IPakFile;
class IStream;
class IPakMaker;
class IPatchMaker;
class IUpdater;
/************************************
错误代码
*************************************/
enum AXP_ERRORS
{
AXP_ERR_SUCCESS = 0, //成功
AXP_ERR_FILE_NOTFOUND, //文件/路径不存在
AXP_ERR_FILE_FORMAT, //文件格式错误
AXP_ERR_FILE_ACCESS, //无访问权限
AXP_ERR_FILE_READ, //读文件错误
AXP_ERR_FILE_WRITE, //写入文件错误
AXP_ERR_FILE_POINT, //移动文件指针错误
AXP_ERR_FILE_EDITMODE, //编辑模式错误
AXP_ERR_FILE_DIFF, //文件不同
AXP_ERR_MEMORY, //没有足够的内存
AXP_ERR_PARAM, //参数错误
AXP_ERR_HASHFULL, //Hash表满了
AXP_ERR_BLOCKFULL, //Block表满了
AXP_ERR_ANALYSENEED, //目录必须经过分析
AXP_ERR_ZIPFILE, //ZIP文件操作错误
AXP_ERR_CRCFAILED, //CRC校验失败
};
/************************************
数据内容类型
*************************************/
enum AXP_CONTENTS
{
AC_DISKFILE, //磁盘文件内容
AC_MEMORY, //内存
};
/************************************
版本差异操作
*************************************/
enum UPDATE_PROCESS
{
UP_NEW_FILE = 0, //文件更新
UP_DEL_FILE = 1, //文件删除
};
/************************************
API接口
*************************************/
//创建一个Pak文件接口
IPakFile* AXP_API createPakFile(void);
//删除一个pak文件接口
void AXP_API destroyPakFile(IPakFile* pFile);
//创建一个PakMaker接口
IPakMaker* AXP_API createPakMaker(void);
//删除一个PakMaker接口
void AXP_API destroyPakMaker(IPakMaker* pMaker);
//创建一个PatchMaker接口
IPatchMaker* AXP_API createPatchMaker(void);
//删除一个PatchMaker接口
void AXP_API destroyPatchMaker(IPatchMaker* pPatchMaker);
//创建一个Updater接口
IUpdater* AXP_API createUpdater(void);
//删除一个Updater接口
void AXP_API destroyUpdater(IUpdater* pUpdater);
//得到上一个错误
AXP_ERRORS AXP_API getLastError(void);
//得到上一个错误的描述
const char* AXP_API getLastErrorDesc(void);
/************************************
打包文件接口
*************************************/
class IPakFile
{
public:
/*!
\brief
打开一个存在的pak文件
\param szFileName
文件名
\param bConst
是否以只读方式打开文件
\return
是否成功
*/
virtual bool openPakFile(const char* szPackFileName, bool bConst) = 0;
/*!
\brief
创建一个新的pak文件
\param szPackFileName
文件名
\return
是否成功
*/
virtual bool createNewPakFile(const char* szPackFileName) = 0;
/*!
\brief
关闭文件
\return
None
*/
virtual void closePakFile(void) = 0;
/*!
\brief
某文件在包中是否存在
\param szFileName
文件名,该文件名会被自动规范化(字符变成小写, '\'转化为'/')
外部不需要做规范化
\return
文件是否存在
*/
virtual bool isFileExists(const char* szFileName) const = 0;
/*!
\brief
以文件流方式打开包中的一个文件
\param szFileName
文件名,该文件名会被自动规范化(字符变成小写, '\'转化为'/')
外部不需要做规范化
\return
数据流指针,如果失败, 返回0
*/
virtual IStream* openFile(const char* szFileName) = 0;
/*!
\brief
得到包中某个文件的大小
\param szFileName
文件名,该文件名会被自动规范化(字符变成小写, '\'转化为'/')
外部不需要做规范化
\return
文件大小(bytes), 如果文件不存在,返回0
*/
virtual unsigned int getFileSize(const char* szFileName) const = 0;
/*!
\brief
加入/更新一个磁盘文件或者内存文件到包中
\param szContents
磁盘文件名,或者内存地址
\param nContentsLen
内存大小(bytes),对于加入磁盘文件方式,该参数无效
\param szFileInPak
加入到包中后,在包中的文件名
\param sourceType
数据源类型
\param bSaveAtOnce
是否需要马上存入磁盘
\return
是否成功
*/
virtual bool insertContents(const char* szContents, unsigned int nContentsLen,
const char* szFileInPak, AXP_CONTENTS sourceType, bool bSaveAtOnce) = 0;
/*!
\brief
将一个文件从包中删除
\param szFileInPak
在包中的文件名
\return
是否成功gone
*/
virtual bool removeFile(const char* szFileInPak, bool bSaveAtOnce) = 0;
/*!
\brief
自检回调函数
\param szFileName
文件名
\param pFileStream
文件内容流
\param
文件是否合法
*/
typedef bool (__stdcall *SELFCHECK_CALLBACK)(const char* szFileName, IStream* pFileStream);
/*
\brief
文件自检功能
\remark
检测内容包括
1. 文件状态是否正确,如果是编辑状态则错误
2. 打开"(list)"文件,检测列表中的文件的大小,crc是否和实际内容是否对应
3. 检测hash表和Block表是否有多余的内容
4. 每个文件由
*/
virtual bool selfCheck(SELFCHECK_CALLBACK callBack) = 0;
};
/************************************
文件流接口,用于读取包中的文件
*************************************/
class IStream
{
public:
/*!
\brief
Read the requisite number of bytes from the stream,
stopping at the end of the file.
\param buf
Reference to a buffer pointer
\param count
Number of bytes to read
\returns
The number of bytes read
*/
virtual unsigned int __fastcall read(void* buf, unsigned int count) = 0;
/*!
\brief
Get a single line from the stream.
\param retBuf
Reference to a buffer pointer
\param maxCount
The maximum length of data to be read, excluding the terminating character
\returns
The number of bytes read, excluding the terminating character
*/
virtual unsigned int readLine(char* retBuf, unsigned int maxCount) = 0;
/*!
\brief
Skip a single line from the stream.
\return
The number of bytes skipped
*/
virtual unsigned int skipLine(void) = 0;
/*!
\brief
Repositions the read point to a specified byte.
*/
virtual void seek(unsigned int pos) = 0;
/*!
\brief
Returns the current byte offset from beginning
*/
virtual unsigned int tell(void) const = 0;
/*!
\brief
Returns true if the stream has reached the end.
*/
virtual bool eof(void) const = 0;
/*!
\brief
Returns the total size of the data to be read from the stream,
or 0 if this is indeterminate for this stream.
*/
virtual unsigned int size(void) const = 0;
/*!
Return the crc checksum of this contents.
*/
virtual unsigned int crc(void) = 0;
/*!
\brief
Close this file, can't call any function after now!
*/
virtual void close(void) = 0;
};
/*******************************************
Pak文件制作者接口,用于制作全新的Pak文件
********************************************/
class IPakMaker
{
public:
/*!
\brief
将磁盘上一个目录加入到包中
\param szFoldInDisk
磁盘路径名
\param szFoldInPak
在包中的路径名,加入的文件在pak包中的名称是相对于该路径的,
如果加在包中的根目录下,该参数为为空字符串""
\param szExtFilter
文件后缀过滤器,使用';'分割多个后缀,例如 "bmp;jpg", 如果为空,表示所有文件
\param bRecursive
是否递归
\return
是否成功加入,通过getLastError获得错误原因
*/
virtual bool addDiskFold(const char* szFoldInDisk, const char* szFoldInPak, const char* szExtFilter, bool bRecursive=true) = 0;
/*!
\brief
加入磁盘上单个文件到包中
\param szFileInDisk
文件在磁盘上的路径
\param szFileInPak
文件在包中的名称, 这个名称中的'\'符号会被自动转化为'/', 但大小写不会转化
\return
是否成功加入,通过getLastError获得错误原因
*/
virtual bool addDiskFile(const char* szFileInDisk, const char* szFileInPak) = 0;
/*!
\brief
保存Pak文件时文件名回调函数
\param szNameInDiskOrg
磁盘上需要打包的文件名
\param szNameInPak
在包中的文件名
\param szNameInDisk
Callback返回的,经过内容转化的磁盘文件名
\param szNameBufLen
szNameInDisk的长度(bytes)
\return
该文件是否需要加入到包中
*/
typedef bool (__stdcall *AXP_PAKMAKER_SAVECALLBACK)(const char *szNameInDiskOrg,
const char* szNameInPak, char* szNameInDisk, int nNameBufLen);
/*!
\brief
将加入的文件保存成pak文件,
\param szPakName
打包文件的文件名
\param AXP_PAKMAKER_SAVECALLBACK
回调函数
\return
是否成功加入,通过getLastError获得错误原因
*/
virtual bool savePakFile(const char* szPakFileName, AXP_PAKMAKER_SAVECALLBACK callbackFunc) = 0;
/*!
\breif
文件比较时的回调函数
\param szFileNameInDisk
磁盘上的文件名
\param pDataStream
在包中的数据,有可能使0
\return
文件是否相同
\remark
有可能有部分文件不需要打入pak包内,这时pDataStream为0
*/
typedef bool (__stdcall *AXP_PAKMAKER_COMPARECALLBACK)(
const char* szFileNameInDisk, IStream* pDataStream);
/*
\brief
将加入的文件和现有的pak文件作内容比较,用于程序测试
\param szPakFileName
现有的pak文件
\param callbackFunc
比较回调函数
\return
是否完全相同,使用getLastError获得原因
*/
virtual bool comparePakFile(const char* szPakFileName, AXP_PAKMAKER_COMPARECALLBACK callbackFunc) = 0;
};
/*******************************************
补丁制作者,用于根据两个版本之间差异制作补丁
*******************************************/
class IPatchMaker
{
public:
/*!
\brief
分析目录, 如果参数szVersion存在,则会重新创建版本文件"(version)"
\param szPath
需要分析的目录路径
\param szVersion
设置的版本号,
如果该参数存在,则会重新创建版本文件"(version)",
如果该参数不存在,则会打开已经存在的"(version)"文件,这种情况下"(version)"
必须存在,如果不存在,会返回错误
\return
是否成功,如果不成功,使用getLastError得到错误值
*/
virtual bool analysePath(const char* szPath, const char* szVersion) = 0;
/*!
\brief
得到某个目录的版本,该目录必须经过分析,否则会返回 ""
\param szPath
目录路径
\return
该目录的版本号,如果目录没有经过分析,返回空字符串
*/
virtual const char* getPathVersion(const char* szPath) = 0;
/*!
\brief
生成Patch包时的回调函数
\param szPakName
Pak包文件名
\param szFileName
文件名
\return
是否需要加入到Patch中
*/
typedef bool (__stdcall *AXP_PATCHMAKER_CALLBACK)(const char *szPakName, const char* szFileName);
/*!
\brief
根据两个目录的分析结果,产生版本差异Patch
\param szOldVersionPath
旧版本目录, 该目录必须经过分析
\param szNewVersionpath
新版本目录, 该目录必须经过分析
\param szPatchFile
产生的Patch文件名
\return
是否成功
*/
virtual bool generatePatch(const char* szOldVersionPath, const char* szNewVersionpath,
const char* szPatchFile, AXP_PATCHMAKER_CALLBACK callBackFunc) = 0;
};
/*******************************************
版本升级接口,用于将旧版本升级到新版本
*******************************************/
class IUpdater
{
public:
/*!
\brief
检查一个文件末尾的crc校验码是否正确
\param szPatchFile
文件名
\return
是否成功
*/
virtual bool checkPatchFileCRC(const char* szPatchFile) = 0;
/*!
\brief
添加一个Patch升级包到升级操作中,后添加的后操作
\param szPatchFile
Patch升级包文件
\return
是否成功
*/
virtual bool addPatchFile(const char* szPatchFile) = 0;
/*!
\brief
返回需要更新的文件数量
\return
需要更新的文件数量
*/
virtual unsigned int getUpdateFile(void) const = 0;
/*!
\brief
升级时的回调函数
\param szPakName
Pak包文件名
\param szFileName
文件名
\param process
所执行的操作
\return
是否需要加入到Patch中
*/
typedef void (__stdcall *AXP_UPDATE_CALLBACK)(const char *szPakName, const char* szFileName,
UPDATE_PROCESS process);
/*!
\brief
按照所加入的Patch包,升级某个目录
\param szPath
需要升级的版本目录
\param callBack
升级回调函数
\return
是否成功
*/
virtual bool updateVersion(const char* szPath, AXP_UPDATE_CALLBACK callBack) = 0;
/*!
\brief
检测一个文件的crc校验码
\param szFileName
文件名
\param dwCrc32
返回的crc码
\param bIgnoreTail
是否忽略最后四个字节
\return
是否成功
*/
virtual bool crcFile(const char* szFilename, unsigned int &dwCrc32, bool bIgnoreTail=false) = 0;
/*!
\brief
根据zip文件获得一个由zzip库调用zzip_dir_open_ext_io时读取zip文件的io接口
\param szZipFile
zip文件名
\return
返回的io接口(zziplib 中的 zzip_plugin_io_t 指针
*/
virtual void* getEncryptZipPluginIO(const char* szZipFile) const = 0;
/*!
\brief
加密/解密zip文件, 并自动加上crc校验尾
\param szPatchFile
需要处理的文件
\param szPatchFile
处理后的文件
\return
是否成功
\remark
函数会自动判断该文件是否经过了crc校验,不会重复校验
*/
virtual bool encryptZipFile(const char* szPatchFile, const char* szNewPatchFile) const = 0;
};
}
火山的模块都是例子 可以购买这个教程
当然除了这个,还有官方语法手册可以学习
《火山视窗模块编写封装课程》
https://bbs.voldp.com/thread-26508-1-1.html
(出处: 递归火山软件开发平台)
火山的模块都是例子
页:
[1]