yyz513 发表于 2025-7-20 23:25:08

火山视窗如何引用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;
};

}



Xelloss0618 发表于 2025-7-21 09:01:05

火山的模块都是例子

沉默流星 发表于 2025-7-21 09:23:10

可以购买这个教程

当然除了这个,还有官方语法手册可以学习

乐易论坛 发表于 2025-7-21 11:31:10

《火山视窗模块编写封装课程》
https://bbs.voldp.com/thread-26508-1-1.html
(出处: 递归火山软件开发平台)




niulin1 发表于 2025-7-21 19:51:36

火山的模块都是例子
页: [1]
查看完整版本: 火山视窗如何引用C++头文h文件跟cpp文件