• 远程调用内核接口(remote call kernel)


    --------------------------------------------------------------------------------
    标题: 远程调用内核接口(remote call kernel)
    作者: 叶飞虎
    版本: 4.0.0.0
    日期: 2013.09.12
    --------------------------------------------------------------------------------

    1. 概述
        RCK(remote call kernel 缩写)为远程调用内核, 其通讯协议为自定义数据流协议。
    RCK 负责远程调用过程中的数据组织, 并不关心实际物理通讯协议, 实则属于逻辑层通讯
    协议。

        RCK 通讯槽接口(RCKSlot)负责数据接收和发送, 属于通讯的适配层, 由第三方来实现
    实际的数据传输接口。

        RCK 包含 Application, Function, Connection, Command, Response 和 Fields 六
    大类, 其主要功能如下:
        a. Application 类主要负责 Function 的组织和 Response 的分发执行;
        b. Function    类主要负责 Function 的定义及按各模式调用;
        c. Connection  类主要负责登录对端应用, Command 请求执行, Response 应答管理,
           以及发送和接收数据等等;
        d. Command     类主要负责函数参数传入, 以及返回值和返回字段值读取;
        e. Response    类主要负责对端指定 Function 请求的执行处理, 如参数读取、返回
           值编辑及提交;
        f. Fields      类主要负责数据库字段值及定义集的组包和拆包。

    2. RCK 通讯槽接口定义
        参见 <RCKSlot.h> 文件

    // =======================================
    // Unit   : RCK Slot (RCK 通讯槽接口)
    // Version: 4.0.0.0 (build 2013.08.17)
    // Author : Kyee Ye
    // Email  : kyee_ye(at)126.com
    // Copyright (C) Kyee workroom
    // =======================================
    
    #ifndef _RCKSlot_H_
    #define _RCKSlot_H_
    
    namespace RCKernel
    {
    
    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    /* 常量定义 */
    
    // 返回值及错误码
    enum TRCKResult
            {krSuccess         =  1,       // 成功
             krFailure         =  0,       // 失败
             krUnknown         = -1,       // 未知错误
             krNotExist        = -2,       // 不存在(如: 连接对象)
             krNotConnect      = -3,       // 连接未打开
             krNonsupport      = -4,       // 不支持
             krVersion         = -5,       // 版本不兼容
             krTimeout         = -6,       // 操作超时
             krPassword        = -7,       // 密码错误
             krIsExisted       = -8,       // 已存在
             krIsRefused       = -9,       // 被拒绝
             krIsIllegal       = -10,      // 不合法
             krIsNullName      = -11,      // 名字为空
             krAttrInvalid     = -12,      // 属性无效
             krStateInvalid    = -13,      // 状态无效
             krHandleInvalid   = -14,      // 句柄无效
             krAccessIllegal   = -15};     // 存取非法
    
    // 通讯槽的属性项
    enum TRCKSlotAttrib
            {ksaError          = 0,        // 通讯槽打开失败的错误信息
             ksaState          = 1,        // 通讯槽的状态
             ksaConnObj        = 2,        // 通讯槽的绑定连接对象
             ksaCurrAddr       = 3,        // 通讯槽的本地地址
             ksaCurrPort       = 4,        // 通讯槽的本地端口号
             ksaPeerAddr       = 5,        // 通讯槽的对端地址
             ksaPeerPort       = 6,        // 通讯槽的对端端口号
             ksaSlotMaxSize    = 7,        // 通讯槽的数据包最大长度, 默认值: 8192
             ksaOnDisconnect   = 8,        // 通讯槽的 OnDisconnect 事件, 断开通讯(TRCKSlotOnEvent)
             ksaOnRecvEvent    = 9,        // 通讯槽的 OnRecvEvent  事件, 接收事件(TRCKSlotOnEvent)
             ksaOnRecvData     = 10,       // 通讯槽的 OnRecvData   事件, 接收数据(TRCKSlotOnRecvData)
             ksaBaseExtended   = 0x10000}; // 通讯槽的扩展属性基数: 扩展属性项
                                           // (注: 扩展属性项必须小于 0x10000)
    
    // 通讯槽的状态
    enum TRCKSlotState
            {kssInactive       = 0,        // 未打开
             kssClosing        = 1,        // 正在关闭
             kssOpening        = 2,        // 正在打开
             kssOpened         = 3};       // 已经打开
    
    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    /* 通讯槽对象的函数类型定义 */
    
    // 操作通讯槽的函数类型
    typedef void  (__stdcall *TRCKSlotOp)(void* ASlotObj);
    
    // 打开通讯槽的函数类型(返回值定义为 TRCKResult)
    typedef long  (__stdcall *TRCKSlotOpen)(void* ASlotObj, long ATimeout);
    
    // 接收数据的函数类型(返回值为接收成功的数据尺寸, 若小于 0 则为错误码)
    typedef long  (__stdcall *TRCKSlotRecv)(void* ASlotObj, void* AData, long ASize);
    
    // 发送数据的函数类型(返回值为发送成功的数据尺寸, 若小于 0 则为错误码)
    typedef long  (__stdcall *TRCKSlotSend)(void* ASlotObj, const void* AData, long ASize);
    
    // 可以发送的函数类型(返回值为可以发送的数据尺寸, 若小于 0 则为错误码)
    typedef long  (__stdcall *TRCKSlotCanSend)(void* ASlotObj, long ASize);
    
    // 取通讯槽整型属性的函数类型(返回值为属性值, ARetCode 为失败的返回码, 允许为空)
    typedef long  (__stdcall *TRCKSlotGetInt)(void* ASlotObj, long Attrib, long* ARetCode);
    
    // 取通讯槽指针属性的函数类型(返回值为属性值, ARetCode 为失败的返回码, 允许为空)
    typedef void* (__stdcall *TRCKSlotGetObj)(void* ASlotObj, long Attrib, long* ARetCode);
    
    // 取通讯槽字符串属性的函数类型(返回值为属性值, ARetCode 成功时为属性值尺寸, 否则为返回码, 允许为空)
    typedef char* (__stdcall *TRCKSlotGetStr)(void* ASlotObj, long Attrib, long* ARetCode);
    
    // 设置通讯槽整型属性的函数类型
    typedef long  (__stdcall *TRCKSlotSetInt)(void* ASlotObj, long Attrib, long  AValue);
    
    // 设置通讯槽指针属性的函数类型
    typedef long  (__stdcall *TRCKSlotSetObj)(void* ASlotObj, long Attrib, void* AValue);
    
    // 设置通讯槽字符串属性的函数类型
    typedef long  (__stdcall *TRCKSlotSetStr)(void* ASlotObj, long Attrib,
                                        const char* AValue,   long ASize);
    
    // 通讯槽对象事件的回调函数类型
    typedef void  (__stdcall *TRCKSlotOnEvent)(void* ASlotObj, void* AConnObj);
    
    // 通讯槽对象 OnRecvData 事件的回调函数类型
    // 注: 若 Recv 方法为 NULL 则通过 OnRecvData 事件接收数据,
    //     否则通过 OnRecvEvent  事件来调用 Recv 方法接收数据.
    typedef void  (__stdcall *TRCKSlotOnRecvData)(void* ASlotObj, void* AConnObj,
                                            const void* AData,    long  ASize);
    
    // 通讯槽对象的方法列表
    #pragma pack(push, 1)
    typedef struct
    {
       long              Size;             // = sizeof(TRCKSlotMethods)
    
       TRCKSlotOpen      Open;             // 打开通讯槽
       TRCKSlotOp        Close;            // 关闭通讯槽
       TRCKSlotOp        FreeObj;          // 释放通讯槽对象
    
       TRCKSlotRecv      Recv;             // 接收数据
       TRCKSlotSend      Send;             // 发送数据
       TRCKSlotCanSend   CanSend;          // 可以发送的数据尺寸
    
       TRCKSlotGetInt    GetInt;           // 取通讯槽整型属性
       TRCKSlotGetObj    GetObj;           // 取通讯槽指针属性
       TRCKSlotGetStr    GetStr;           // 取通讯槽字符串属性
    
       TRCKSlotSetInt    SetInt;           // 设置通讯槽整型属性
       TRCKSlotSetObj    SetObj;           // 设置通讯槽指针属性
       TRCKSlotSetStr    SetStr;           // 设置通讯槽字符串属性
    } TRCKSlotMethods, *PRCKSlotMethods;
    #pragma pack(pop)
    
    }
    
    #endif
    


     

    3. RCK 接口定义
        参见 <RCKernel.h> 文件

    // =======================================
    // Unit   : RC Kernel
    // Version: 4.0.0.0 (build 2013.09.02)
    // Author : Kyee Ye
    // Email  : kyee_ye(at)126.com
    // Copyright (C) Kyee workroom
    // =======================================
    
    #ifndef _RCKernel_H_
    #define _RCKernel_H_
    
    #include "RCKSlot.h"
    
    #pragma comment(lib, "RCKernel.lib")
    
    namespace RCKernel
    {
    
    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    /* 常量定义 */
    
    // 数据类型
    enum TRCKDataType
            {kdtNone           = 0,        // 无类型
             kdtString         = 1,        // 字符串类型  (自定义尺寸)
             kdtInteger        = 2,        // 整型类型    (4 Bytes)
             kdtBoolean        = 3,        // 布尔类型    (1 Bytes)
             kdtDouble         = 4,        // 浮点类型    (8 Bytes)
             kdtStruct         = 5,        // 结构类型    (自定义尺寸)
             kdtByte           = 6,        // 字节        (1 Bytes)
             kdtWord           = 7,        // 双字节      (2 Bytes)
             kdtSmallint       = 8,        // 16位整型    (2 Bytes)
             kdtInt64          = 9,        // 64位整型    (8 Bytes)
             kdtDateTime       = 10,       // 日期时间类型(8 Bytes)
             kdtCurrency       = 11};      // 货币类型    (8 Bytes)
    
    // 接口的属性项
    enum TRCKAttrib
            {kaVersion         = 0,        // 接口版本信息, 格式: "x.x.x.x (build yyyy.mm.dd)"
             kaAppCount        = 1,        // 应用个数
             kaCmdCount        = 2,        // 命令个数
             kaConnCount       = 3,        // 连接个数
             kaDealThreads     = 4,        // 处理线程最大个数, 默认值: 16
             kaDealCacheSize   = 5,        // 处理线程缓冲池尺寸, 默认值: 16
             kaSendThreads     = 6,        // 发送线程最大个数, 默认值: 8
             kaSendCacheSize   = 7,        // 发送线程缓冲池尺寸, 默认值: 8
             kaBaseAppObj      = 0x10000,  // 应用索引基数: 应用对象
             kaBaseAppName     = 0x20000,  // 应用索引基数: 应用名
             kaBaseConnObj     = 0x40000}; // 连接索引基数: 连接对象
    
    // 应用的属性项
    enum TRCKAppAttrib
            {kaaData           = 0,        // 自定义数据
             kaaName           = 1,        // 应用名
             kaaState          = 2,        // 应用的状态
             kaaPassword       = 3,        // 应用的密码
             kaaFuncCount      = 4,        // 应用的函数个数
             kaaConnCount      = 5,        // 应用的已连接数
             kaaMaxThreads     = 6,        // 应用的回调函数处理线程最大个数, 默认值: 8
             kaaMaxConnCount   = 7,        // 应用的最大连接个数, 默认值: 0 表示无限制
             kaaOnConnLogin    = 8,        // 应用的 OnConnLogin   事件, 连接登录(TRCKOnAppLogin)
             kaaOnConnLogout   = 9,        // 应用的 OnConnLogout  事件, 连接登出(TRCKOnAppLogout)
             kaaOnExecResp     = 10,       // 应用的 OnExecResp    事件, 执行应答(TRCKOnAppResp)
             kaaOnRespCancel   = 11,       // 应用的 OnRespCancel  事件, 应答已取消(TRCKOnAppResp)
             kaaOnRespConfirm  = 12,       // 应用的 OnRespConfirm 事件, 应答已确认(TRCKOnAppResp)
             kaaBaseFuncObj    = 0x10000,  // 应用的函数索引基数: 函数对象
             kaaBaseFuncName   = 0x20000,  // 应用的函数索引基数: 函数名
             kaaBaseConnObj    = 0x40000}; // 应用的连接索引基数: 连接对象
    
    // 应用的状态
    enum TRCKAppState
            {kasInactive       = 0,        // 函数未定义
             kasDefining       = 1,        // 函数正在定义
             kasDefined        = 2,        // 函数已定义
             kasClosing        = 3,        // 正在关闭
             kasOpening        = 4,        // 正在打开
             kasOpened         = 5};       // 已打开
    
    // 函数的属性项
    enum TRCKFuncAttrib
            {kfaData           = 0,        // 自定义数据
             kfaName           = 1,        // 函数名
             kfaActive         = 2,        // 函数是否已激活
             kfaAppObj         = 3,        // 函数所属应用对象
             kfaRetType        = 4,        // 函数返回值类型
             kfaRetSize        = 5,        // 函数返回值定义尺寸
             kfaCallMode       = 6,        // 回调函数模式
             kfaCallback       = 7,        // 回调函数指针
             kfaParamCount     = 8,        // 函数的参数个数
             kfaFieldCount     = 9,        // 函数的返回字段个数
             kfaNeedConfirm    = 10,       // 函数应答返回是否需要确认
             kfaNeedEncrypt    = 11,       // 函数参数和返回值在通讯中是否需要加密
             kfaBaseParamName  = 0x10000,  // 函数参数索引基数: 参数名
             kfaBaseParamType  = 0x20000,  // 函数参数索引基数: 参数类型
             kfaBaseParamSize  = 0x30000,  // 函数参数索引基数: 参数定义尺寸
             kfaBaseParamIsRef = 0x40000,  // 函数参数索引基数: 参数是否为引用指针
             kfaBaseFieldName  = 0x60000,  // 函数返回字段索引基数: 返回字段名
             kfaBaseFieldType  = 0x70000,  // 函数返回字段索引基数: 返回字段类型
             kfaBaseFieldSize  = 0x80000}; // 函数返回字段索引基数: 返回字段定义尺寸
    
    // 回调函数模式
    enum TRCKFuncCallMode
            {kfcmNone          = 0,        // 无, 请求通过 OnExecResp 事件返回
             kfcmFixed         = 1,        // 固定的回调模式(TRCKDoFixed类型)
             kfcmCdecl         = 2,        // C 语言调用协议
             kfcmStdcall       = 3,        // API 标准调用协议
             kfcmIDCdecl       = 4,        // 带 AResp 参数的 C 语言调用协议
             kfcmIDStdcall     = 5};       // 带 AResp 参数的 API 标准调用协议
    
    // 连接的属性项
    enum TRCKConnAttrib
            {kcaError          = 0,        // 错误信息
             kcaData           = 1,        // 自定义数据
             kcaType           = 2,        // 连接的类型
             kcaState          = 3,        // 连接的状态
             kcaSlotObj        = 4,        // 连接绑定的通讯槽对象(用于TRCKSlotMethods方法列表)
             kcaCanLogin       = 5,        // 连接是否能够登录对端应用, 默认值: (Type == kctTCPClient)
             kcaCanBindApp     = 6,        // 连接是否能够绑定应用, 默认值: (Type == kctTCPSrvClient)
             kcaBindAppObj     = 7,        // 连接绑定的应用对象, 默认值: NULL
             kcaIsSyncLink     = 8,        // 通讯槽对象打开成功后是否同步建立连接, 默认值: (Type == kctTCPClient)
             kcaSlotTimeout    = 9,        // 通讯槽对象的打开超时(单位: 毫秒), 默认值: 30000
             kcaSlotMaxSize    = 10,       // 通讯槽对象的数据包最大长度, 默认值: 8192
             kcaSendQueueSize  = 11,       // 连接的 RCKConnSendData 发送队列尺寸, 默认值: 256
             kcaTimeout        = 12,       // 连接的操作超时(单位: 毫秒), 默认值: 30000
             kcaAppName        = 13,       // 登录对端应用名
             kcaAppPass        = 14,       // 登录对端应用密码
             kcaCurrAddr       = 15,       // 连接的本地地址
             kcaCurrPort       = 16,       // 连接的本地端口号
             kcaPeerAddr       = 17,       // 连接的对端地址
             kcaPeerPort       = 18,       // 连接的对端端口号
             kcaLastTick       = 19,       // 连接的最后一次收发数据时 tick
             kcaFuncCount      = 20,       // 已加载对端应用的函数个数, 默认值: -1 表示未加载
             kcaKeepTimeout    = 21,       // 连接的心跳检测超时时间(单位: 毫秒), 默认值: 30000
             kcaKeepInterval   = 22,       // 连接的心跳检测重试间隔(单位: 毫秒), 默认值: 10000
             kcaKeepRetryTimes = 23,       // 连接的心跳检测重试次数, 默认值: 3
             kcaOnConnect      = 24,       // 连接的 OnConnect     事件, 连接成功(TRCKOnObjEvent)
             kcaOnDisconnect   = 25,       // 连接的 OnDisconnect  事件, 断开连接(TRCKOnObjEvent)
             kcaOnLogin        = 26,       // 连接的 OnLogin       事件, 登录对端应用(TRCKOnObjEvent)
             kcaOnLogout       = 27,       // 连接的 OnLogout      事件, 登出对端应用(TRCKOnObjEvent)
             kcaOnCmdReturn    = 28,       // 连接的 OnCmdReturn   事件, 命令返回(TRCKOnCmdReturn)
             kcaOnRecvData     = 29,       // 连接的 OnRecvData    事件, 接收数据(TRCKOnRecvData)
             kcaBaseSlotExt    = 0x10000,  // 通讯槽对象的扩展属性基数: 扩展属性项
             kcaBaseFuncName   = 0x20000}; // 已加载对端应用的函数索引基数: 函数名
    
    // 连接的类型
    enum TRCKConnType
            {kctUnknown        = 0,        // (未知)
             kctTCPClient      = 1,        // TCP 客户端
             kctTCPSrvClient   = 2,        // TCP 服务端的客户连接
             kctSHMClient      = 3,        // SHM 客户端(共享内存通讯)
             kctSHMSrvClient   = 4,        // SHM 服务端的客户连接(共享内存通讯)
             // ... ...                    // 可以根据 slot 通讯方式自定义扩充
             };
    
    // 连接的状态
    enum TRCKConnState
            {kcsInactive       = 0,        // 未打开
             kcsClosing        = 1,        // 正在关闭
             kcsOpening        = 2,        // 正在打开
             kcsOpened         = 3,        // 已经打开
             kcsLogouting      = 4,        // 正在登出对端应用
             kcsLogging        = 5,        // 正在登录对端应用
             kcsLogged         = 6,        // 已登录对端应用
             kcsLoading        = 7,        // 正在加载对端应用函数列表
             kcsLoaded         = 8};       // 已加载对端应用函数列表
    
    // 命令的属性项
    enum TRCKCmdAttrib
            {kmaData           = 0,        // 自定义数据
             kmaName           = 1,        // 命令的函数名
             kmaState          = 2,        // 命令的状态
             kmaConnObj        = 3,        // 命令的连接对象
             kmaRetType        = 4,        // 命令的返回值类型
             kmaRetSize        = 5,        // 命令的返回值定义尺寸
             kmaParamCount     = 6,        // 命令的参数个数
             kmaFieldCount     = 7,        // 命令的返回字段个数
             kmaExecResult     = 8,        // 命令的执行返回结果(值参见 TRCKCmdResult)
             kmaEncrypted      = 9,        // 命令的参数和返回值在通讯中是否加密
             kmaAppIsValid     = 10,       // 命令已开始的应用是否有效
             kmaBaseParamName  = 0x10000,  // 命令的参数索引基数: 参数名
             kmaBaseParamType  = 0x20000,  // 命令的参数索引基数: 参数类型
             kmaBaseParamSize  = 0x30000,  // 命令的参数索引基数: 参数定义尺寸
             kmaBaseFieldName  = 0x60000,  // 命令的返回字段索引基数: 返回字段名
             kmaBaseFieldType  = 0x70000,  // 命令的返回字段索引基数: 返回字段类型
             kmaBaseFieldSize  = 0x80000}; // 命令的返回字段索引基数: 返回字段定义尺寸
    
    // 命令返回结果
    enum TRCKCmdResult
            {kmrFailure        = 0,        // 失败
             kmrSuccess        = 1,        // 成功
             kmrException      = 2,        // 异常
             kmrBreak          = 3};       // 中止
    
    // 命令状态
    enum TRCKCmdState
            {kmsIdle           = 0,        // 空闲
             kmsEnding         = 1,        // 正在结束
             kmsBeginning      = 2,        // 正在开始
             kmsBegun          = 3,        // 已开始
             kmsExecuting      = 4,        // 正在执行
             kmsExecuted       = 5,        // 执行结束, 已返回
             kmsCanceled       = 6};       // 已取消(如: 超时等等)
    
    // 应答状态
    enum TRCKRespState
            {krsIdle           = 0,        // 空闲
             krsExecuting      = 1,        // 正在执行
             krsWaitSend       = 2,        // 应答已执行, 正在等待发送
             krsSending        = 3,        // 应答已执行, 正在发送
             krsSent           = 4,        // 应答已执行, 应答发送完成
             krsConfirmed      = 5,        // 应答已确认接收
             krsCanceled       = 6};       // 应答已取消
    
    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    /* 回调函数类型定义 */
    
    // 固定的回调模式
    typedef void  (__stdcall *TRCKDoFixed)(void* AFuncObj, void* AResp);
    
    // 对象事件的回调函数类型
    typedef void  (__stdcall *TRCKOnObjEvent)(void* AObject);
    
    // 应用连接登录事件的回调函数类型(OnConnLogin)
    typedef void  (__stdcall *TRCKOnAppLogin)(void* AppObj, void* AConnObj, bool& AIsRefused);
    
    // 应用连接登出事件的回调函数类型(OnConnLogout)
    typedef void  (__stdcall *TRCKOnAppLogout)(void* AppObj, void* AConnObj);
    
    // 应用应答事件的回调函数类型(OnExecResp, OnRespCancel, OnRespConfirm)
    typedef void  (__stdcall *TRCKOnAppResp)(void* AppObj, void* AFuncObj, void* AResp);
    
    // 连接命令返回事件的回调函数类型(AResult 值参见 TRCKCmdResult)
    typedef void  (__stdcall *TRCKOnCmdReturn)(void* AConnObj, void* ACmdObj, long AResult);
    
    // 接收自定义数据的回调函数类型
    typedef void  (__stdcall *TRCKOnRecvData)(void* AConnObj, const void* AData, long ASize);
    
    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    /* 接口相关函数 */
    
    // 接口初始化/释放函数
    void     __stdcall RCKInitialize();
    void     __stdcall RCKUninitialize();
    
    // 接口版本信息, 格式: "x.x.x.x (build yyyy.mm.dd)"
    // AVersion    返回版本号, 如: 0x0708090A 表示 7.8.9.10
    char*    __stdcall RCKGetVersion(long* AVersion);
    
    // 取当前操作的最后错误码(注: 用于返回值非错误码的函数, 如 RCKConnCreate 等等)
    long     __stdcall RCKGetLastError();
    
    // 在回调函数中取当前应用线程的应答
    void*    __stdcall RCKGetCurrResp();
    
    // 根据应用名取应用对象
    void*    __stdcall RCKGetAppObj(const char* AName);
    
    // 取接口属性
    // (返回值为属性值, ARetCode 为失败的返回码, 允许为空, 当字符串类型成功时为值尺寸)
    long     __stdcall RCKGetInt(long Attrib, long* ARetCode);
    void*    __stdcall RCKGetObj(long Attrib, long* ARetCode);
    char*    __stdcall RCKGetStr(long Attrib, long* ARetCode);
    
    // 设置接口属性
    long     __stdcall RCKSetInt(long Attrib, long  AValue);
    long     __stdcall RCKSetObj(long Attrib, void* AValue);
    long     __stdcall RCKSetStr(long Attrib, const char* AValue, long ASize);
    
    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    /* Application 的相关函数 */
    
    // 创建/释放应用
    void*    __stdcall RCKAppCreate(const char* AName, const char* APassword);
    void     __stdcall RCKAppFree(void* AppObj);
    
    // 开始/结束应用的函数定义
    long     __stdcall RCKAppFuncBegin(void* AppObj);
    long     __stdcall RCKAppFuncEnd(void* AppObj);
    
    // 根据函数名取应用的函数对象
    void*    __stdcall RCKAppFuncObj(void* AppObj, const char* AName);
    
    // 打开/关闭应用/强制注销应用的连接
    long     __stdcall RCKAppOpen(void* AppObj);
    long     __stdcall RCKAppClose(void* AppObj);
    long     __stdcall RCKAppLogout(void* AppObj, void* AConnObj);
    
    // 取应用属性
    // (返回值为属性值, ARetCode 为失败的返回码, 允许为空, 当字符串类型成功时为值尺寸)
    long     __stdcall RCKAppGetInt(void* AppObj, long Attrib, long* ARetCode);
    void*    __stdcall RCKAppGetObj(void* AppObj, long Attrib, long* ARetCode);
    char*    __stdcall RCKAppGetStr(void* AppObj, long Attrib, long* ARetCode);
    
    // 设置应用属性
    long     __stdcall RCKAppSetInt(void* AppObj, long Attrib, long  AValue);
    long     __stdcall RCKAppSetObj(void* AppObj, long Attrib, void* AValue);
    long     __stdcall RCKAppSetStr(void* AppObj, long Attrib,
                              const char* AValue, long ASize);
    
    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    /* Function 的相关函数 */
    
    // 创建/释放 Function
    void*    __stdcall RCKFuncCreate(void* AppObj, long ACallMode, void* ACallback,
                               const char* AName,  long ARetType,  long  ARetSize);
    void     __stdcall RCKFuncFree(void* AFuncObj);
    
    // 添加 Function 参数/返回字段
    long     __stdcall RCKFuncAddParam(void* AFuncObj,    const char* AName,
                                       long  AType, long ASize, bool  AIsRef);
    long     __stdcall RCKFuncAddField(void* AFuncObj,    const char* AName,
                                       long  AType,             long  ASize);
    
    // 取 Function 参数名索引/返回字段名索引
    long     __stdcall RCKFuncParamIndex(void* AFuncObj, const char* AName);
    long     __stdcall RCKFuncFieldIndex(void* AFuncObj, const char* AName);
    
    // 取 Function 属性
    // (返回值为属性值, ARetCode 为失败的返回码, 允许为空, 当字符串类型成功时为值尺寸)
    long     __stdcall RCKFuncGetInt(void* AFuncObj, long Attrib, long* ARetCode);
    void*    __stdcall RCKFuncGetObj(void* AFuncObj, long Attrib, long* ARetCode);
    char*    __stdcall RCKFuncGetStr(void* AFuncObj, long Attrib, long* ARetCode);
    
    // 设置 Function 属性
    long     __stdcall RCKFuncSetInt(void* AFuncObj, long Attrib, long  AValue);
    long     __stdcall RCKFuncSetObj(void* AFuncObj, long Attrib, void* AValue);
    long     __stdcall RCKFuncSetStr(void* AFuncObj, long Attrib,
                               const char* AValue,   long ASize);
    
    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    /* Connection 的相关函数 */
    
    // 创建/释放连接(注: ASlotObj 必须非空且唯一, ASlotMethods 必须非空)
    void*    __stdcall RCKConnCreate(long AType, void* ASlotObj,
                                const TRCKSlotMethods* ASlotMethods);
    void     __stdcall RCKConnFree(void* AConnObj);
    
    // 打开/关闭连接
    long     __stdcall RCKConnOpen(void* AConnObj);
    long     __stdcall RCKConnClose(void* AConnObj);
    
    // 登录/登出对端应用
    long     __stdcall RCKConnLogin(void* AConnObj);
    long     __stdcall RCKConnLogout(void* AConnObj);
    
    // 加载对端应用的函数列表
    long     __stdcall RCKConnLoad(void* AConnObj);
    
    // 发送数据(参数 ANeedPack 表示数据是否需要压缩发送)
    long     __stdcall RCKConnSendData(void* AConnObj, const void* AData,
                                       long  ASize,          bool  ANeedPack);
    
    // 取连接属性
    // (返回值为属性值, ARetCode 为失败的返回码, 允许为空, 当字符串类型成功时为值尺寸)
    long     __stdcall RCKConnGetInt(void* AConnObj, long Attrib, long* ARetCode);
    void*    __stdcall RCKConnGetObj(void* AConnObj, long Attrib, long* ARetCode);
    char*    __stdcall RCKConnGetStr(void* AConnObj, long Attrib, long* ARetCode);
    
    // 设置连接属性
    long     __stdcall RCKConnSetInt(void* AConnObj, long Attrib, long  AValue);
    long     __stdcall RCKConnSetObj(void* AConnObj, long Attrib, void* AValue);
    long     __stdcall RCKConnSetStr(void* AConnObj, long Attrib,
                               const char* AValue,   long ASize);
    
    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    /* Command 的相关函数 */
    
    // 创建/释放命令
    void*    __stdcall RCKCmdCreate();
    void     __stdcall RCKCmdFree(void* ACmdObj);
    
    // 开始/结束命令
    long     __stdcall RCKCmdBegin(void* ACmdObj, const char* AName);
    long     __stdcall RCKCmdEnd(void* ACmdObj);
    
    // 重新开始/执行命令
    long     __stdcall RCKCmdRestart(void* ACmdObj);
    long     __stdcall RCKCmdExecute(void* ACmdObj, unsigned long ATimeout);
    
    // 取命令属性
    // (返回值为属性值, ARetCode 为失败的返回码, 允许为空, 当字符串类型成功时为值尺寸)
    long     __stdcall RCKCmdGetInt(void* ACmdObj, long Attrib, long* ARetCode);
    void*    __stdcall RCKCmdGetObj(void* ACmdObj, long Attrib, long* ARetCode);
    char*    __stdcall RCKCmdGetStr(void* ACmdObj, long Attrib, long* ARetCode);
    
    // 设置命令属性
    long     __stdcall RCKCmdSetInt(void* ACmdObj, long Attrib, long  AValue);
    long     __stdcall RCKCmdSetObj(void* ACmdObj, long Attrib, void* AValue);
    long     __stdcall RCKCmdSetStr(void* ACmdObj, long Attrib,
                              const char* AValue,  long ASize);
    
    // 取当前命令的各类型返回值
    // (ARetCode 为失败的返回码, 允许为空, 当字符串或结构类型成功时为值尺寸)
    char*    __stdcall RCKCmdRetStr(void* ACmdObj, long* ARetCode);
    long     __stdcall RCKCmdRetInt(void* ACmdObj, long* ARetCode);
    bool     __stdcall RCKCmdRetBool(void* ACmdObj, long* ARetCode);
    double   __stdcall RCKCmdRetFloat(void* ACmdObj, long* ARetCode);
    void*    __stdcall RCKCmdRetStruct(void* ACmdObj, long* ARetCode);
    __int64  __stdcall RCKCmdRetInt64(void* ACmdObj, long* ARetCode);
    double   __stdcall RCKCmdRetDate(void* ACmdObj, long* ARetCode);
    long     __stdcall RCKCmdRetCustom(void* ACmdObj, void* AValue, long ASize);
    
    // 清除当前命令参数值/取当前命令的参数名索引
    long     __stdcall RCKCmdParamClear(void* ACmdObj);
    long     __stdcall RCKCmdParamIndex(void* ACmdObj, const char* AName);
    
    // 根据参数索引设置当前命令的各类型参数值
    long     __stdcall RCKCmdParamByStr(void* ACmdObj, long AIndex,
                                  const char* AValue,  long ASize);
    long     __stdcall RCKCmdParamByInt(void* ACmdObj, long AIndex, long AValue);
    long     __stdcall RCKCmdParamByBool(void* ACmdObj, long AIndex, bool AValue);
    long     __stdcall RCKCmdParamByFloat(void* ACmdObj, long AIndex, double AValue);
    long     __stdcall RCKCmdParamByStruct(void* ACmdObj, long AIndex, void* AValue);
    long     __stdcall RCKCmdParamByInt64(void* ACmdObj, long AIndex, __int64 AValue);
    long     __stdcall RCKCmdParamByDate(void* ACmdObj, long AIndex, double AValue);
    long     __stdcall RCKCmdParamByCustom(void* ACmdObj, long AIndex,
                                     const void* AValue,  long ASize);
    
    // 根据参数名设置当前命令的各类型参数值
    long     __stdcall RCKCmdParamByStr_(void* ACmdObj, const char* AName,
                                   const char* AValue,        long  ASize);
    long     __stdcall RCKCmdParamByInt_(void* ACmdObj, const char* AName, long AValue);
    long     __stdcall RCKCmdParamByBool_(void* ACmdObj, const char* AName, bool AValue);
    long     __stdcall RCKCmdParamByFloat_(void* ACmdObj, const char* AName, double AValue);
    long     __stdcall RCKCmdParamByStruct_(void* ACmdObj, const char* AName, void* AValue);
    long     __stdcall RCKCmdParamByInt64_(void* ACmdObj, const char* AName, __int64 AValue);
    long     __stdcall RCKCmdParamByDate_(void* ACmdObj, const char* AName, double AValue);
    long     __stdcall RCKCmdParamByCustom_(void* ACmdObj, const char* AName,
                                      const void* AValue,        long  ASize);
    
    // 取当前命令的返回字段名索引/字段值是否为空(ARetCode 为失败的返回码, 允许为空)
    long     __stdcall RCKCmdFieldIndex(void* ACmdObj, const char* AName);
    bool     __stdcall RCKCmdFieldIsNull(void* ACmdObj, long AIndex, long* ARetCode);
    bool     __stdcall RCKCmdFieldIsNull_(void* ACmdObj, const char* AName, long* ARetCode);
    
    // 根据字段索引取当前命令的各类型字段值
    // (ARetCode 为失败的返回码, 允许为空, 当字符串或结构类型成功时为值尺寸)
    char*    __stdcall RCKCmdFieldStr(void* ACmdObj, long AIndex, long* ARetCode);
    long     __stdcall RCKCmdFieldInt(void* ACmdObj, long AIndex, long* ARetCode);
    bool     __stdcall RCKCmdFieldBool(void* ACmdObj, long AIndex, long* ARetCode);
    double   __stdcall RCKCmdFieldFloat(void* ACmdObj, long AIndex, long* ARetCode);
    void*    __stdcall RCKCmdFieldStruct(void* ACmdObj, long AIndex, long* ARetCode);
    __int64  __stdcall RCKCmdFieldInt64(void* ACmdObj, long AIndex, long* ARetCode);
    double   __stdcall RCKCmdFieldDate(void* ACmdObj, long AIndex, long* ARetCode);
    long     __stdcall RCKCmdFieldCustom(void* ACmdObj, long AIndex,
                                         void* AValue,  long ASize);
    
    // 根据字段名取当前命令的各类型字段值
    // (ARetCode 为失败的返回码, 允许为空, 当字符串或结构类型成功时为值尺寸)
    char*    __stdcall RCKCmdFieldStr_(void* ACmdObj, const char* AName, long* ARetCode);
    long     __stdcall RCKCmdFieldInt_(void* ACmdObj, const char* AName, long* ARetCode);
    bool     __stdcall RCKCmdFieldBool_(void* ACmdObj, const char* AName, long* ARetCode);
    double   __stdcall RCKCmdFieldFloat_(void* ACmdObj, const char* AName, long* ARetCode);
    void*    __stdcall RCKCmdFieldStruct_(void* ACmdObj, const char* AName, long* ARetCode);
    __int64  __stdcall RCKCmdFieldInt64_(void* ACmdObj, const char* AName, long* ARetCode);
    double   __stdcall RCKCmdFieldDate_(void* ACmdObj, const char* AName, long* ARetCode);
    long     __stdcall RCKCmdFieldCustom_(void* ACmdObj, const char* AName,
                                          void* AValue,        long  ASize);
    
    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    /* Response 的相关函数 */
    
    // 取应答的连接对象/函数对象/状态
    void*    __stdcall RCKRespConnObj(void* AResp);
    void*    __stdcall RCKRespFuncObj(void* AResp);
    long     __stdcall RCKRespState(void* AResp);
    
    // 取应答的各类型返回值
    // (ARetCode 为失败的返回码, 允许为空, 当字符串或结构类型成功时为值尺寸)
    char*    __stdcall RCKRespRetStr(void* AResp, long* ARetCode);
    long     __stdcall RCKRespRetInt(void* AResp, long* ARetCode);
    bool     __stdcall RCKRespRetBool(void* AResp, long* ARetCode);
    double   __stdcall RCKRespRetFloat(void* AResp, long* ARetCode);
    void*    __stdcall RCKRespRetStruct(void* AResp, long* ARetCode);
    __int64  __stdcall RCKRespRetInt64(void* AResp, long* ARetCode);
    double   __stdcall RCKRespRetDate(void* AResp, long* ARetCode);
    long     __stdcall RCKRespRetCustom(void* AResp, void* AValue, long ASize);
    
    // 根据索引取应答的各类型参数值
    // (ARetCode 为失败的返回码, 允许为空, 当字符串或结构类型成功时为值尺寸)
    char*    __stdcall RCKRespParamStr(void* AResp, long AIndex, long* ARetCode);
    long     __stdcall RCKRespParamInt(void* AResp, long AIndex, long* ARetCode);
    bool     __stdcall RCKRespParamBool(void* AResp, long AIndex, long* ARetCode);
    double   __stdcall RCKRespParamFloat(void* AResp, long AIndex, long* ARetCode);
    void*    __stdcall RCKRespParamStruct(void* AResp, long AIndex, long* ARetCode);
    __int64  __stdcall RCKRespParamInt64(void* AResp, long AIndex, long* ARetCode);
    double   __stdcall RCKRespParamDate(void* AResp, long AIndex, long* ARetCode);
    long     __stdcall RCKRespParamCustom(void* AResp,  long AIndex,
                                          void* AValue, long ASize);
    
    // 根据参数名取应答的各类型参数值
    // (ARetCode 为失败的返回码, 允许为空, 当字符串或结构类型成功时为值尺寸)
    char*    __stdcall RCKRespParamStr_(void* AResp, const char* AName, long* ARetCode);
    long     __stdcall RCKRespParamInt_(void* AResp, const char* AName, long* ARetCode);
    bool     __stdcall RCKRespParamBool_(void* AResp, const char* AName, long* ARetCode);
    double   __stdcall RCKRespParamFloat_(void* AResp, const char* AName, long* ARetCode);
    void*    __stdcall RCKRespParamStruct_(void* AResp, const char* AName, long* ARetCode);
    __int64  __stdcall RCKRespParamInt64_(void* AResp, const char* AName, long* ARetCode);
    double   __stdcall RCKRespParamDate_(void* AResp, const char* AName, long* ARetCode);
    long     __stdcall RCKRespParamCustom_(void* AResp, const char* AName,
                                           void* AValue,      long  ASize);
    
    // 根据索引取应答的各类型字段返回值
    // (ARetCode 为失败的返回码, 允许为空, 当字符串或结构类型成功时为值尺寸)
    char*    __stdcall RCKRespFieldStr(void* AResp, long AIndex, long* ARetCode);
    long     __stdcall RCKRespFieldInt(void* AResp, long AIndex, long* ARetCode);
    bool     __stdcall RCKRespFieldBool(void* AResp, long AIndex, long* ARetCode);
    double   __stdcall RCKRespFieldFloat(void* AResp, long AIndex, long* ARetCode);
    void*    __stdcall RCKRespFieldStruct(void* AResp, long AIndex, long* ARetCode);
    __int64  __stdcall RCKRespFieldInt64(void* AResp, long AIndex, long* ARetCode);
    double   __stdcall RCKRespFieldDate(void* AResp, long AIndex, long* ARetCode);
    long     __stdcall RCKRespFieldCustom(void* AResp,  long AIndex,
                                          void* AValue, long ASize);
    
    // 根据字段名取应答的各类型字段返回值
    // (ARetCode 为失败的返回码, 允许为空, 当字符串或结构类型成功时为值尺寸)
    char*    __stdcall RCKRespFieldStr_(void* AResp, const char* AName, long* ARetCode);
    long     __stdcall RCKRespFieldInt_(void* AResp, const char* AName, long* ARetCode);
    bool     __stdcall RCKRespFieldBool_(void* AResp, const char* AName, long* ARetCode);
    double   __stdcall RCKRespFieldFloat_(void* AResp, const char* AName, long* ARetCode);
    void*    __stdcall RCKRespFieldStruct_(void* AResp, const char* AName, long* ARetCode);
    __int64  __stdcall RCKRespFieldInt64_(void* AResp, const char* AName, long* ARetCode);
    double   __stdcall RCKRespFieldDate_(void* AResp, const char* AName, long* ARetCode);
    long     __stdcall RCKRespFieldCustom_(void* AResp, const char* AName,
                                           void* AValue,      long  ASize);
    
    // 设置应答的各类型返回值
    long     __stdcall RCKRespRetByStr(void* AResp, const char* AValue, long ASize);
    long     __stdcall RCKRespRetByInt(void* AResp, long AValue);
    long     __stdcall RCKRespRetByBool(void* AResp, bool AValue);
    long     __stdcall RCKRespRetByFloat(void* AResp, double AValue);
    long     __stdcall RCKRespRetByStruct(void* AResp, void* AValue);
    long     __stdcall RCKRespRetByInt64(void* AResp, __int64 AValue);
    long     __stdcall RCKRespRetByDate(void* AResp, double AValue);
    long     __stdcall RCKRespRetByCustom(void* AResp, const void* AValue, long ASize);
    
    // 根据索引设置应答的各类型字段返回值
    long     __stdcall RCKRespFieldByStr(void* AResp,  long AIndex,
                                   const char* AValue, long ASize);
    long     __stdcall RCKRespFieldByInt(void* AResp, long AIndex, long AValue);
    long     __stdcall RCKRespFieldByBool(void* AResp, long AIndex, bool AValue);
    long     __stdcall RCKRespFieldByFloat(void* AResp, long AIndex, double AValue);
    long     __stdcall RCKRespFieldByStruct(void* AResp, long AIndex, void* AValue);
    long     __stdcall RCKRespFieldByInt64(void* AResp, long AIndex, __int64 AValue);
    long     __stdcall RCKRespFieldByDate(void* AResp, long AIndex, double AValue);
    long     __stdcall RCKRespFieldByCustom(void* AResp,  long AIndex,
                                      const void* AValue, long ASize);
    
    // 根据字段名设置应答的各类型字段返回值
    long     __stdcall RCKRespFieldByStr_(void* AResp, const char* AName,
                                    const char* AValue,      long  ASize);
    long     __stdcall RCKRespFieldByInt_(void* AResp, const char* AName, long AValue);
    long     __stdcall RCKRespFieldByBool_(void* AResp, const char* AName, bool AValue);
    long     __stdcall RCKRespFieldByFloat_(void* AResp, const char* AName, double AValue);
    long     __stdcall RCKRespFieldByStruct_(void* AResp, const char* AName, void* AValue);
    long     __stdcall RCKRespFieldByInt64_(void* AResp, const char* AName, __int64 AValue);
    long     __stdcall RCKRespFieldByDate_(void* AResp, const char* AName, double AValue);
    long     __stdcall RCKRespFieldByCustom_(void* AResp, const char* AName,
                                       const void* AValue,      long  ASize);
    
    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    /* Fields 的相关函数 */
    
    // 创建/释放字段集
    void*    __stdcall RCKFieldsCreate();
    void     __stdcall RCKFieldsFree(void* AFields);
    
    // 添加字段定义/删除指定索引的字段及定义
    long     __stdcall RCKFieldDefsAdd(void* AFields, const char* AName,
                                       long  AType,         long  ASize);
    void     __stdcall RCKFieldDefsDelete(void* AFields, long AIndex);
    
    // 清除/拷贝/输出字段定义集/取字段定义集的数据尺寸
    void     __stdcall RCKFieldDefsClear(void* AFields);
    long     __stdcall RCKFieldDefsAssign(void* AFields, const void* ADefs, long ASize);
    void*    __stdcall RCKFieldDefsOutput(void* AFields, long* ARetSize);
    long     __stdcall RCKFieldDefsSize(const void* AFieldDefs);
    
    // 清除/拷贝/输出字段集的数据/取字段集的数据尺寸
    void     __stdcall RCKFieldsClear(void* AFields);
    long     __stdcall RCKFieldsAssign(void* AFields, const void* AData, long ASize);
    void*    __stdcall RCKFieldsOutput(void* AFields, long* ARetSize);
    long     __stdcall RCKFieldsSize(void* AFields);
    
    // 取字段个数/取字段名所在索引
    long     __stdcall RCKFieldCount(void* AFields);
    long     __stdcall RCKFieldIndex(void* AFields, const char* AName);
    
    // 取索引字段名/类型/定义尺寸/值尺寸
    char*    __stdcall RCKFieldName(void* AFields, long AIndex);
    long     __stdcall RCKFieldType(void* AFields, long AIndex);
    long     __stdcall RCKFieldDefSize(void* AFields, long AIndex);
    long     __stdcall RCKFieldSize(void* AFields, long AIndex);
    
    // 判断索引字段是否为空(ARetCode 为失败的返回码, 允许为空)
    bool     __stdcall RCKFieldIsNull(void* AFields, long AIndex, long* ARetCode);
    bool     __stdcall RCKFieldIsNull_(void* AFields, const char* AName, long* ARetCode);
    
    // 取索引字段的各类型值
    // (ARetCode 为失败的返回码, 允许为空, 当字符串或结构类型成功时为值尺寸)
    char*    __stdcall RCKFieldAsStr(void* AFields, long AIndex, long* ARetCode);
    long     __stdcall RCKFieldAsInt(void* AFields, long AIndex, long* ARetCode);
    bool     __stdcall RCKFieldAsBool(void* AFields, long AIndex, long* ARetCode);
    double   __stdcall RCKFieldAsFloat(void* AFields, long AIndex, long* ARetCode);
    void*    __stdcall RCKFieldAsStruct(void* AFields, long AIndex, long* ARetCode);
    __int64  __stdcall RCKFieldAsInt64(void* AFields, long AIndex, long* ARetCode);
    double   __stdcall RCKFieldAsDate(void* AFields, long AIndex, long* ARetCode);
    long     __stdcall RCKFieldGetCustom(void* AFields, long AIndex,
                                         void* AValue,  long ASize);
    
    // 取字段名字段的各类型值
    // (ARetCode 为失败的返回码, 允许为空, 当字符串或结构类型成功时为值尺寸)
    char*    __stdcall RCKFieldAsStr_(void* AFields, const char* AName, long* ARetCode);
    long     __stdcall RCKFieldAsInt_(void* AFields, const char* AName, long* ARetCode);
    bool     __stdcall RCKFieldAsBool_(void* AFields, const char* AName, long* ARetCode);
    double   __stdcall RCKFieldAsFloat_(void* AFields, const char* AName, long* ARetCode);
    void*    __stdcall RCKFieldAsStruct_(void* AFields, const char* AName, long* ARetCode);
    __int64  __stdcall RCKFieldAsInt64_(void* AFields, const char* AName, long* ARetCode);
    double   __stdcall RCKFieldAsDate_(void* AFields, const char* AName, long* ARetCode);
    long     __stdcall RCKFieldGetCustom_(void* AFields, const char* AName,
                                          void* AValue,        long  ASize);
    
    // 设置索引字段的类型值
    long     __stdcall RCKFieldByStr(void* AFields, long AIndex,
                               const char* AValue,  long ASize);
    long     __stdcall RCKFieldByInt(void* AFields, long AIndex, long AValue);
    long     __stdcall RCKFieldByBool(void* AFields, long AIndex, bool AValue);
    long     __stdcall RCKFieldByFloat(void* AFields, long AIndex, double AValue);
    long     __stdcall RCKFieldByStruct(void* AFields, long AIndex, void* AValue);
    long     __stdcall RCKFieldByInt64(void* AFields, long AIndex, __int64 AValue);
    long     __stdcall RCKFieldByDate(void* AFields, long AIndex, double AValue);
    long     __stdcall RCKFieldSetCustom(void* AFields, long AIndex,
                                   const void* AValue,  long ASize);
    
    // 设置字段名字段的类型值
    long     __stdcall RCKFieldByStr_(void* AFields, const char* AName,
                                const char* AValue,        long  ASize);
    long     __stdcall RCKFieldByInt_(void* AFields, const char* AName, long AValue);
    long     __stdcall RCKFieldByBool_(void* AFields, const char* AName, bool AValue);
    long     __stdcall RCKFieldByFloat_(void* AFields, const char* AName, double AValue);
    long     __stdcall RCKFieldByStruct_(void* AFields, const char* AName, const void* AValue);
    long     __stdcall RCKFieldByInt64_(void* AFields, const char* AName, __int64 AValue);
    long     __stdcall RCKFieldByDate_(void* AFields, const char* AName, double AValue);
    long     __stdcall RCKFieldSetCustom_(void* AFields, const char* AName,
                                    const void* AValue,        long  ASize);
    
    }
    
    #endif
    


    4. RC 的自环接口定义(注: 内部实现 RCK 通讯槽接口)
        自环接口用于进程内通过 Command 调用 Application 函数, 便于输出接口统一。
        参见 <RC4SL.h> 文件

    // =======================================
    // Unit   : RC for self-loop
    // Version: 4.0.0.0 (build 2013.08.18)
    // Author : Kyee Ye
    // Email  : kyee_ye(at)126.com
    // Copyright (C) Kyee workroom
    // =======================================
    
    #ifndef _RC4SL_H_
    #define _RC4SL_H_
    
    #include "RCKernel.h"
    using namespace RCKernel;
    
    #ifdef _WIN64
    #pragma comment(lib, "RC4SL64.lib")
    #else
    #pragma comment(lib, "RC4SL32.lib")
    #endif
    
    namespace RC4SL
    {
    
    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    /* 常量定义 */
    
    // 返回值及错误码
    // 见 RCKSlot.h 中的 TRCKResult 定义
    
    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    /* 接口相关函数 */
    
    // 接口初始化/释放函数
    void  __stdcall SLInitialize();
    void  __stdcall SLUninitialize();
    
    // 接口版本信息, 格式: "x.x.x.x (build yyyy.mm.dd)"
    // AVersion    返回版本号, 如: 0x0708090A 表示 7.8.9.10
    char* __stdcall SLGetVersion(long* AVersion);
    
    // 取当前操作的最后错误码(注: 用于返回值非错误码的函数)
    long  __stdcall SLGetLastError();
    
    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    /* SL 的相关函数 */
    
    // 创建 SL 连接, 返回 RCKConnCreate 创建的对象
    // 注:  SL 连接的释放调用 RCKConnFree 即可
    void* __stdcall SLCreate();
    
    // 取 SL 连接个数/指定索引的连接对象
    long  __stdcall SLGetCount();
    void* __stdcall SLGetConnObj(long AIndex);
    
    // 断开 SL 连接(注: 用于测试 Slot 的 OnDisconnect 事件)
    long  __stdcall SLDisconnect(void* ASlotObj);
    
    }
    
    #endif
    


     

    5. RC 的 TCP 接口定义(注: 内部实现 RCK 通讯槽接口)
        参见 <RC4TCP.h> 文件

    // =======================================
    // Unit   : RC for TCP
    // Version: 4.0.0.0 (build 2013.09.09)
    // Author : Kyee Ye
    // Email  : kyee_ye(at)126.com
    // Copyright (C) Kyee workroom
    // =======================================
    
    #ifndef _RC4TCP_H_
    #define _RC4TCP_H_
    
    #include "RCKernel.h"
    using namespace RCKernel;
    
    #ifdef _WIN64
    #pragma comment(lib, "RC4TCP64.lib")
    #else
    #pragma comment(lib, "RC4TCP32.lib")
    #endif
    
    namespace RC4TCP
    {
    
    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    /* 常量定义 */
    
    // 返回值及错误码
    // 见 RCKSlot.h 中的 TRCKResult 定义
    
    // 接口的属性项
    enum TTCPAttrib
            {taVersion         = 0,        // 接口版本信息, 格式: "x.x.x.x (build yyyy.mm.dd)"
             taServerCount     = 1,        // TCP 服务端个数
             taRecvThreads     = 2,        // 所有客户端的接收线程最大个数, 默认值: 8
             taCacheThreads    = 3,        // 所有客户端的接收线程缓冲池尺寸, 默认值: 8
             taBaseServer      = 0x10000}; // 服务端索引基数: 服务端对象
    
    // 服务端的属性项
    enum TTCPServerAttrib
            {tsaError          = 0,        // 打开服务失败返回的错误信息
             tsaData           = 1,        // 自定义数据
             tsaAddr           = 2,        // 服务端的绑定IP地址, 默认值: ""
             tsaPort           = 3,        // 服务端的侦听端口号, 默认值: 0
             tsaState          = 4,        // 服务端的状态
             tsaLinger         = 5,        // TCP 句柄关闭后的拖延时长(秒), 默认值: 0
             tsaListenQueue    = 6,        // 服务端的侦听连接队列尺寸, 默认值: 5
             tsaRecvThreads    = 7,        // 接收线程最大个数, 默认值: 8
             tsaCacheThreads   = 8,        // 接收线程缓冲池尺寸, 默认值: 8
             tsaMaxClientCount = 9,        // 服务端连接的最大客户端个数, 默认值: 0 表示无限制
             tsaSrvClientCount = 10,       // 当前服务已连接的客户端个数
             tsaCanLogin       = 11,       // 连接是否能够登录对端应用, 默认值: false
             tsaCanBindApp     = 12,       // 连接是否能够绑定应用, 默认值: true
             tsaSendMaxSize    = 13,       // 通讯槽对象的发送整个包最大长度, 默认值: 8192
             tsaSendQueueSize  = 14,       // 连接的 RCKConnSendData 发送队列尺寸, 默认值: 256
             tsaTimeout        = 15,       // 连接的操作超时(单位: 毫秒), 默认值: 30000
             tsaKeepTimeout    = 16,       // 连接的心跳检测超时时间(单位: 毫秒), 默认值: 30000
             tsaKeepInterval   = 17,       // 连接的心跳检测重试间隔(单位: 毫秒), 默认值: 10000
             tsaKeepRetryTimes = 18,       // 连接的心跳检测重试次数, 默认值: 3
             tsaOnListen       = 19,       // 服务的 OnListen        事件, 打开侦听(TRCKOnObjEvent)
             tsaOnDisconnect   = 20,       // 服务的 OnDisconnect    事件, 断开侦听(TRCKOnObjEvent)
             tsaOnAccept       = 21,       // 服务的 OnAccept        事件, 接受连接(TTCPOnAccept), 可以设置连接属性
             tsaOnFreeClt      = 22,       // 服务的 OnFreeClt       事件, 释放连接(TRCKOnObjEvent)
             tsaOnCltConnect   = 23,       // 连接的 OnCltConnect    事件, 连接成功(TRCKOnObjEvent)
             tsaOnCltDisconnect= 24,       // 连接的 OnCltDisconnect 事件, 断开连接(TRCKOnObjEvent)
             tsaOnCltLogin     = 25,       // 连接的 OnCltLogin      事件, 登录对端应用(TRCKOnObjEvent)
             tsaOnCltLogout    = 26,       // 连接的 OnCltLogout     事件, 登出对端应用(TRCKOnObjEvent)
             tsaOnCltCmdReturn = 27,       // 连接的 OnCltCmdReturn  事件, 命令返回(TRCKOnCmdReturn)
             tsaOnCltRecvData  = 28,       // 连接的 OnCltRecvData   事件, 接收数据(TRCKOnRecvData)
             tsaBaseSrvClient  = 0x10000}; // 已连接的客户端索引基数: 客户端对象
    
    // 服务端的状态
    enum TTCPServerState
            {tssInactive       = 0,        // 未打开
             tssClosing        = 1,        // 正在关闭
             tssOpening        = 2,        // 正在打开
             tssOpened         = 3};       // 已经打开
    
    // 服务端客户连接的属性项(即是连接通讯槽对象的扩展属性项, kcaBaseSlotExt + Attrib)
    enum TTCPSrvCltAttrib
            {tscaData          = 0,        // 自定义数据
             tscaSrvObj        = 1,        // 连接的服务端对象
             tscaIsValid       = 2};       // 连接是否有效
    
    // 客户端的属性项(即是连接通讯槽对象的扩展属性项, kcaBaseSlotExt + Attrib)
    enum TTCPClientAttrib
            {tcaError          = 0,        // 打开客户端失败返回的错误信息
             tcaData           = 1,        // 自定义数据
             tcaLinger         = 2};       // TCP 句柄关闭后的拖延时长(秒), 默认值: 0
    
    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    /* 接口回调函数类型定义 */
    
    // 服务端接受连接事件的回调函数类型(OnAccept)
    typedef void (__stdcall *TTCPOnAccept)(void* ASrvObj, void* AConnObj, bool& AIsRefused);
    
    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    /* 接口相关函数 */
    
    // 接口初始化/释放函数
    void  __stdcall TCPInitialize();
    void  __stdcall TCPUninitialize();
    
    // 接口版本信息, 格式: "x.x.x.x (build yyyy.mm.dd)"
    // AVersion    返回版本号, 如: 0x0708090A 表示 7.8.9.10
    char* __stdcall TCPGetVersion(long* AVersion);
    
    // 取当前操作的最后错误码(注: 用于返回值非错误码的函数)
    long  __stdcall TCPGetLastError();
    
    // 取接口属性
    // (返回值为属性值, ARetCode 为失败的返回码, 允许为空, 当字符串类型成功时为值尺寸)
    long  __stdcall TCPGetInt(long Attrib, long* ARetCode);
    void* __stdcall TCPGetObj(long Attrib, long* ARetCode);
    char* __stdcall TCPGetStr(long Attrib, long* ARetCode);
    
    // 设置接口属性
    long  __stdcall TCPSetInt(long Attrib, long  AValue);
    long  __stdcall TCPSetObj(long Attrib, void* AValue);
    long  __stdcall TCPSetStr(long Attrib, const char* AValue, long ASize);
    
    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    /* TCP 服务端的相关函数 */
    
    // 创建/释放 TCP 服务端
    void* __stdcall TCPServerCreate();
    void  __stdcall TCPServerFree(void* ASrvObj);
    
    // 打开/关闭 TCP 服务端
    long  __stdcall TCPServerOpen(void* ASrvObj);
    long  __stdcall TCPServerClose(void* ASrvObj);
    
    // 取 TCP 服务端属性
    // (返回值为属性值, ARetCode 为失败的返回码, 允许为空, 当字符串类型成功时为值尺寸)
    long  __stdcall TCPServerGetInt(void* ASrvObj, long Attrib, long* ARetCode);
    void* __stdcall TCPServerGetObj(void* ASrvObj, long Attrib, long* ARetCode);
    char* __stdcall TCPServerGetStr(void* ASrvObj, long Attrib, long* ARetCode);
    
    // 设置 TCP 服务端属性
    long  __stdcall TCPServerSetInt(void* ASrvObj, long Attrib, long  AValue);
    long  __stdcall TCPServerSetObj(void* ASrvObj, long Attrib, void* AValue);
    long  __stdcall TCPServerSetStr(void* ASrvObj, long Attrib,
                              const char* AValue,  long ASize);
    
    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    /* TCP 客户端的相关函数 */
    
    // 创建 TCP 客户端, 返回 RCKConnCreate 创建的对象
    // 注:  TCP 客户端的释放调用 RCKConnFree 即可
    //      TCP 客户端的属性是连接通讯槽对象的扩展属性项, kcaBaseSlotExt + Attrib
    void* __stdcall TCPClientCreate();
    
    }
    
    #endif
    


     

    --------------------------------------------------------------------------------

  • 相关阅读:
    MyBatis 框架系列之基础初识
    从零开始实现在线直播
    面试中关于Redis的问题看这篇就够了
    Spring Boot 中使用 MyBatis 整合 Druid 多数据源
    MyBatis的foreach语句详解
    小结:“服务器端跳转”和“客户端跳转”的区别
    Centos7.3安装vsftp服务
    Spring 注解@Value详解
    Spring中@Bean与@Configuration
    数据结构之LinkList
  • 原文地址:https://www.cnblogs.com/riskyer/p/3318173.html
Copyright © 2020-2023  润新知