码迷,mamicode.com
首页 > Web开发 > 详细

远程调用内核接口的封装类(RCKObjs)

时间:2014-07-09 10:28:56      阅读:273      评论:0      收藏:0      [点我收藏+]

标签:rc   rck   c++源码   

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      类主要负责数据库字段值及定义集的组包和拆包。

 

封装类的头文件(RCKObjs.h)

 

// =======================================
// Unit   : RCKernel objects
// Version: 5.0.0.0 (build 2014.07.07)
// Author : Kyee Ye
// Email  : kyee_ye(at)126.com
// Copyright (C) Kyee workroom
// =======================================

#ifndef _RCKObjs_H_
#define _RCKObjs_H_

#include "KYLib.h"
#include "RCKernel.h"

// 使用 RCKernel 的命名空间
namespace RCKernel
{
   namespace __object__
   {

/* begin namespace */

class TRCAppObj;
class TRCFuncObj;
class TRCConnObj;
class TRCCmdObj;

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/* 初始化/释放单元 */

// 初始化/释放 RCKObjs 单元(注: 内部有引用计数)
void        InitRCKObjs();
void        FreeRCKObjs(bool AForced = false);

// ID -> 对象
TRCCmdObj*  CmdID2Object(void* ACmdID);   // 命令ID -> 对象
TRCFuncObj* FuncID2Object(void* AFuncID); // 函数ID -> 对象

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/* 应用对象(TRCAppObj)的相关函数 */

// 创建/释放应用对象
TRCAppObj*  CreateAppObj(const char* AName, const char* APassword, long* ARetCode = NULL);
void        FreeAppObj(TRCAppObj* AppObj);

// 应用对象引用计数增 1
TRCAppObj*  IncRefAppObj(void* AppID);
bool        IncRefAppObj_(TRCAppObj* AppObj);

// 应用对象引用计数增/减 1(注: AppObj 对象必须存在)
void        IncRefAppObj(TRCAppObj* AppObj);
void        DecRefAppObj(TRCAppObj* AppObj);

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/* 连接对象(TRCConnObj)的相关函数 */

// 创建/释放连接对象(注: AConnID 必须存在)
TRCConnObj* CreateConnObj(void* AConnID, bool ANeedFree, long* ARetCode = NULL);
void        FreeConnObj(TRCConnObj* AConnObj);

// 连接对象引用计数增 1
TRCConnObj* IncRefConnObj(void* AConnID);
bool        IncRefConnObj_(TRCConnObj* AConnObj);

// 连接对象引用计数增/减 1(注: AConnObj 对象必须存在)
void        IncRefConnObj(TRCConnObj* AConnObj);
void        DecRefConnObj(TRCConnObj* AConnObj);

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/* 命令对象(TRCCmdObj)的相关函数 */

// 创建/释放命令对象(注: AConnObj 必须存在)
TRCCmdObj*  CreateCmdObj(void* AConnID = NULL);
TRCCmdObj*  CreateCmdObj(TRCConnObj* AConnObj);
void        FreeCmdObj(TRCCmdObj* ACmdObj);

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/* TRCAppObj - RCK 应用类 */

class TRCAppObj
{
private:
   // 映射列表类型
   typedef TKYMapObjKey<void>    TObjList;

public:
   // 连接登录事件
   typedef void (TObject::*TDoConnLogin)(TRCAppObj* AppObj, void* AConnID, bool& AIsRefused);
   typedef struct
   {
      TDoConnLogin   Method;
      void*          Object;
   } TOnConnLogin;

   // 连接登出事件
   typedef void (TObject::*TDoConnLogout)(TRCAppObj* AppObj, void* AConnID);
   typedef struct
   {
      TDoConnLogout  Method;
      void*          Object;
   } TOnConnLogout;

   // 应答事件
   typedef void (TObject::*TDoRespEvent)(TRCAppObj* AppObj, void* AFuncID, void* AConnID);
   typedef struct
   {
      TDoRespEvent   Method;
      void*          Object;
   } TOnRespEvent;

   // 函数释放事件
   typedef void (TObject::*TDoFuncFree)(TRCAppObj* AppObj, TRCFuncObj* AFuncObj);
   typedef struct
   {
      TDoFuncFree    Method;
      void*          Object;
   } TOnFuncFree;

public:
   TRCAppObj();
   virtual ~TRCAppObj();

   // 属性
   void*          Data() const         { return FData; }
   KYString       Name() const         { return FName; }
   void*          AppID() const        { return FAppID; }
   long           State() const        { return RCKAppGetInt(FAppID, kaaState, NULL); }
   long           FuncCount() const    { return RCKAppGetInt(FAppID, kaaFuncCount, NULL); }
   long           ConnCount() const    { return RCKAppGetInt(FAppID, kaaConnCount, NULL); }
   long           MaxThreads() const   { return RCKAppGetInt(FAppID, kaaMaxThreads, NULL); }
   long           MaxConnCount() const { return RCKAppGetInt(FAppID, kaaMaxConnCount, NULL); }

   // 设置属性
   void           SetData(void* AData) { FData = AData; }
   long           SetName(const KYString& AName);
   long           SetPassword(const char* APassword, long ALength)
                  { return RCKAppSetStr(FAppID, kaaPassword, APassword, ALength); }
   long           SetPassword(const KYString& APassword)
                  { return SetPassword((char*)APassword, APassword.Length()); }
   long           SetMaxThreads(long ACount)
                  { return RCKAppSetInt(FAppID, kaaMaxThreads, ACount); }
   long           SetMaxConnCount(long ACount)
                  { return RCKAppSetInt(FAppID, kaaMaxConnCount, ACount); }

   // 读取应用的连接/函数
   void*          ConnID(long AIndex) const
                  { return RCKAppGetObj(FAppID, kaaBaseConnObj + AIndex, NULL); }
   void*          FuncID(long AIndex) const
                  { return RCKAppGetObj(FAppID, kaaBaseFuncObj + AIndex, NULL); }
   void*          FuncID(const char* AName) const
                  { return RCKAppFuncObj(FAppID, AName); }
   char*          FuncName(long AIndex) const
                  { return RCKAppGetStr(FAppID, kaaBaseFuncName + AIndex, NULL); }

   // 开始/结束函数定义
   long           BeginDefs()          { return RCKAppFuncBegin(FAppID); }
   long           EndDefs()            { return RCKAppFuncEnd(FAppID); }

   // 新建/删除/清除函数定义
   TRCFuncObj*    NewFuncObj(const char* AName, long ARetType,  long  ARetSize,
                                                long ACallMode, void* ACallback);
   bool           DeleteFuncObj(TRCFuncObj* AFuncObj);
   void           ClearFuncObjs();

   // 打开/关闭应用/强制注销应用的连接
   long           Open()               { return RCKAppOpen(FAppID); }
   long           Close()              { return RCKAppClose(FAppID); }
   long           Logout(void* AConnID){ return RCKAppLogout(FAppID, AConnID); }

   // 设置事件
   long           SetOnConnLogin(TDoConnLogin AMethod, void* AObject);
   long           SetOnConnLogout(TDoConnLogout AMethod, void* AObject);
   long           SetOnExecResp(TDoRespEvent AMethod, void* AObject);
   long           SetOnRespCancel(TDoRespEvent AMethod, void* AObject);
   long           SetOnRespConfirm(TDoRespEvent AMethod, void* AObject);

   // 事件
   TOnFuncFree    OnFuncFree;

protected:
   // 当前锁
   void           Lock() const         { FLock->Enter(); }
   void           Unlock() const       { FLock->Leave(); }

   // 对象次数增/减 1
   long           IncObjTimes()        { return InterlockedIncrement(&FObjTimes); }
   long           DecObjTimes()        { return InterlockedDecrement(&FObjTimes); }

private:
   // 执行初始化事件/清除函数列表
   void           DoInitEvent();
   void           DoClearFuncObjs();

   // 执行事件方法
   void           DoConnLogin(void* AConnID, bool& AIsRefused);
   void           DoConnLogout(void* AConnID);
   void           DoExecResp(void* AFuncID, void* AConnID);
   void           DoRespCancel(void* AFuncID, void* AConnID);
   void           DoRespConfirm(void* AFuncID, void* AConnID);

   // 事件方法
   void           DoIDDeletion(void* AFuncID);
   void           DoObjDeletion(TRCFuncObj* AFuncObj);

private:
   void*          FData;               // 自定义数据
   TKYCritSect*   FLock;               // 当前锁
   KYString       FName;               // 应用名
   void*          FAppID;              // 应用 ID
   long           FObjTimes;           // 对象引用次数
   TObjList*      FFuncList;           // 函数列表

   // 事件
   TOnConnLogin   FOnConnLogin;        // 连接登录
   TOnConnLogout  FOnConnLogout;       // 连接登出
   TOnRespEvent   FOnExecResp;         // 执行应答
   TOnRespEvent   FOnRespCancel;       // 应答已取消
   TOnRespEvent   FOnRespConfirm;      // 应答已确认

private:
   // 应用事件的回调函数
   static void __stdcall _RCKOnConnLogin(void* AppID, void* AConnID, bool& AIsRefused);
   static void __stdcall _RCKOnConnLogout(void* AppID, void* AConnID);
   static void __stdcall _RCKOnExecResp(void* AppID, void* AFuncID, void* AConnID);
   static void __stdcall _RCKOnRespCancel(void* AppID, void* AFuncID, void* AConnID);
   static void __stdcall _RCKOnRespConfirm(void* AppID, void* AFuncID, void* AConnID);

private:
   friend class TRCKObjs;
};

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/* TRCFuncObj - RCK 函数类 */

class TRCFuncObj
{
public:
   TRCFuncObj();
   virtual ~TRCFuncObj();

   // 属性
   void*          Data() const         { return FData; }
   KYString       Name() const         { return FName; }
   void*          FuncID() const       { return FFuncID; }
   TRCAppObj*     AppObj() const       { return FAppObj; }
   bool           Active() const       { return RCKFuncGetInt(FFuncID, kfaActive, NULL) == 1; }

   long           RetType() const      { return RCKFuncGetInt(FFuncID, kfaRetType, NULL); }
   long           RetSize() const      { return RCKFuncGetInt(FFuncID, kfaRetSize, NULL); }
   long           CallMode() const     { return RCKFuncGetInt(FFuncID, kfaCallMode, NULL); }
   void*          Callback() const     { return RCKFuncGetObj(FFuncID, kfaCallback, NULL); }
   bool           NeedConfirm() const  { return RCKFuncGetInt(FFuncID, kfaNeedConfirm, NULL) == 1; }
   bool           NeedEncrypt() const  { return RCKFuncGetInt(FFuncID, kfaNeedEncrypt, NULL) == 1; }

   // 设置属性
   void           SetData(void* AData) { FData = AData; }
   long           SetNeedConfirm(bool ANeed)
                  { return RCKFuncSetInt(FFuncID, kfaNeedConfirm, ANeed); }
   long           SetNeedEncrypt(bool ANeed)
                  { return RCKFuncSetInt(FFuncID, kfaNeedEncrypt, ANeed); }

   // 读取参数定义
   long           ParamCount() const   { return RCKFuncGetInt(FFuncID, kfaParamCount, NULL); }
   long           ParamIndex(const char* AName) const
                  { return RCKFuncParamIndex(FFuncID, AName); }
   long           ParamIndex(const KYString& AName) const
                  { return RCKFuncParamIndex(FFuncID, (char*)AName); }
   KYString       ParamName(long AIndex) const
                  { return RCKFuncGetStr(FFuncID, kfaBaseParamName + AIndex, NULL); }
   long           ParamType(long AIndex) const
                  { return RCKFuncGetInt(FFuncID, kfaBaseParamType + AIndex, NULL); }
   long           ParamSize(long AIndex) const
                  { return RCKFuncGetInt(FFuncID, kfaBaseParamSize + AIndex, NULL); }
   bool           ParamIsRef(long AIndex) const
                  { return RCKFuncGetInt(FFuncID, kfaBaseParamIsRef + AIndex, NULL) == 1; }

   // 读取返回字段定义
   long           FieldCount() const   { return RCKFuncGetInt(FFuncID, kfaFieldCount, NULL); }
   long           FieldIndex(const char* AName) const
                  { return RCKFuncFieldIndex(FFuncID, AName); }
   long           FieldIndex(const KYString& AName) const
                  { return RCKFuncFieldIndex(FFuncID, (char*)AName); }
   KYString       FieldName(long AIndex) const
                  { return RCKFuncGetStr(FFuncID, kfaBaseFieldName + AIndex, NULL); }
   long           FieldType(long AIndex) const
                  { return RCKFuncGetInt(FFuncID, kfaBaseFieldType + AIndex, NULL); }
   long           FieldSize(long AIndex) const
                  { return RCKFuncGetInt(FFuncID, kfaBaseFieldSize + AIndex, NULL); }

   // 添加参数
   long           AddParam(const char* AName, long AType, long ASize = 0, bool AIsRef = false)
                  { return RCKFuncAddParam(FFuncID, AName, AType, ASize, AIsRef); }
   long           AddParam(const KYString& AName, long AType, long ASize = 0, bool AIsRef = false)
                  { return RCKFuncAddParam(FFuncID, (char*)AName, AType, ASize, AIsRef); }

   // 添加返回字段
   long           AddField(const char* AName, long AType, long ASize = 0)
                  { return RCKFuncAddField(FFuncID, AName, AType, ASize); }
   long           AddField(const KYString& AName, long AType, long ASize = 0)
                  { return RCKFuncAddField(FFuncID, (char*)AName, AType, ASize); }

private:
   void*          FData;               // 自定义数据
   KYString       FName;               // 函数名
   void*          FFuncID;             // 函数 ID
   TRCAppObj*     FAppObj;             // 应用对象

private:
   friend class TRCKObjs;
   friend class TRCAppObj;
};

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/* TRCConnObj - RCK 连接类 */

class TRCConnObj
{
public:
   // 连接通知事件
   typedef void (TObject::*TDoNotify)(TRCConnObj* AConnObj);
   typedef struct
   {
      TDoNotify      Method;
      void*          Object;
   } TOnNotify;

   // 连接命令返回事件
   typedef void (TObject::*TDoCmdReturn)(TRCConnObj* AConnObj, void* ACmdID, long AResult);
   typedef struct
   {
      TDoCmdReturn   Method;
      void*          Object;
   } TOnCmdReturn;

   // 接收自定义数据事件
   typedef void (TObject::*TDoRecvData)(TRCConnObj* AConnObj, const void* AData, long ASize);
   typedef struct
   {
      TDoRecvData    Method;
      void*          Object;
   } TOnRecvData;

public:
   TRCConnObj(void* AConnID = NULL, bool ANeedFree = false);
   virtual ~TRCConnObj();

   // 属性
   void*          Data() const         { return FData; }
   void*          ConnID() const       { return FConnID; }
   bool           CanEvent() const     { return FCanEvent; }
   bool           NeedFree() const     { return FNeedFree; }

   KYString       Error() const        { return RCKConnGetStr(FConnID, kcaError, NULL); }
   long           Type() const         { return RCKConnGetInt(FConnID, kcaType, NULL); }
   long           State() const        { return RCKConnGetInt(FConnID, kcaState, NULL); }
   long           Timeout() const      { return RCKConnGetInt(FConnID, kcaTimeout, NULL); }
   void*          SlotObj() const      { return RCKConnGetObj(FConnID, kcaSlotObj, NULL); }
   bool           CanLogin() const     { return RCKConnGetInt(FConnID, kcaCanLogin, NULL) == 1; }
   bool           CanBindApp() const   { return RCKConnGetInt(FConnID, kcaCanBindApp, NULL) == 1; }
   bool           IsSyncLink() const   { return RCKConnGetInt(FConnID, kcaIsSyncLink, NULL) == 1; }
   void*          BindAppObj() const   { return RCKConnGetObj(FConnID, kcaBindAppObj, NULL); }
   long           BindTimeout() const  { return RCKConnGetInt(FConnID, kcaBindTimeout, NULL); }
   long           SlotTimeout() const  { return RCKConnGetInt(FConnID, kcaSlotTimeout, NULL); }
   long           SlotMaxSize() const  { return RCKConnGetInt(FConnID, kcaSlotMaxSize, NULL); }
   long           SendQueueSize() const{ return RCKConnGetInt(FConnID, kcaSendQueueSize, NULL); }

   KYString       AppName() const      { return RCKConnGetStr(FConnID, kcaAppName, NULL); }
   KYString       CurrAddr() const     { return RCKConnGetStr(FConnID, kcaCurrAddr, NULL); }
   long           CurrPort() const     { return RCKConnGetInt(FConnID, kcaCurrPort, NULL); }
   KYString       PeerAddr() const     { return RCKConnGetStr(FConnID, kcaPeerAddr, NULL); }
   long           PeerPort() const     { return RCKConnGetInt(FConnID, kcaPeerPort, NULL); }
   long           LastTick() const     { return RCKConnGetInt(FConnID, kcaLastTick, NULL); }

   long           KeepTimeout() const  { return RCKConnGetInt(FConnID, kcaKeepTimeout, NULL); }
   long           KeepInterval() const { return RCKConnGetInt(FConnID, kcaKeepInterval, NULL); }
   long           KeepRetryTimes()const{ return RCKConnGetInt(FConnID, kcaKeepRetryTimes, NULL); }

   long           FuncCount() const    { return RCKConnGetInt(FConnID, kcaFuncCount, NULL); }
   KYString       FuncName(long AIndex) const
                  { return RCKConnGetStr(FConnID, kcaBaseFuncName + AIndex, NULL); }

   // 设置属性
   void           SetData(void* AData) { FData = AData; }
   long           SetTimeout(long ATimeout)
                  { return RCKConnSetInt(FConnID, kcaTimeout, ATimeout); }
   long           SetCanLogin(bool ACanLogin)
                  { return RCKConnSetInt(FConnID, kcaCanLogin, ACanLogin); }
   long           SetCanBindApp(bool ACanBindApp)
                  { return RCKConnSetInt(FConnID, kcaCanBindApp, ACanBindApp); }
   long           SetBindTimeout(long ATimeout)
                  { return RCKConnSetInt(FConnID, kcaBindTimeout, ATimeout); }
   long           SetIsSyncLink(bool AIsSyncLink)
                  { return RCKConnSetInt(FConnID, kcaIsSyncLink, AIsSyncLink); }
   long           SetSlotTimeout(long ATimeout)
                  { return RCKConnSetInt(FConnID, kcaSlotTimeout, ATimeout); }
   long           SetSlotMaxSize(long AMaxSize)
                  { return RCKConnSetInt(FConnID, kcaSlotMaxSize, AMaxSize); }
   long           SetSendQueueSize(long AQueueSize)
                  { return RCKConnSetInt(FConnID, kcaSendQueueSize, AQueueSize); }

   long           SetAppName(const char* AName, long ALength)
                  { return RCKConnSetStr(FConnID, kcaAppName, AName, ALength); }
   long           SetAppName(const KYString& AName)
                  { return SetAppName((char*)AName, AName.Length()); }

   long           SetAppPass(const char* APassword, long ALength)
                  { return RCKConnSetStr(FConnID, kcaAppPass, APassword, ALength); }
   long           SetAppPass(const KYString& APassword)
                  { return SetAppPass((char*)APassword, APassword.Length()); }

   long           SetCurrAddr(const char* Addr, long ALength)
                  { return RCKConnSetStr(FConnID, kcaCurrAddr, Addr, ALength); }
   long           SetCurrAddr(const KYString& Addr)
                  { return SetCurrAddr((char*)Addr, Addr.Length()); }
   long           SetCurrPort(long APort)
                  { return RCKConnSetInt(FConnID, kcaCurrPort, APort); }

   long           SetPeerAddr(const char* Addr, long ALength)
                  { return RCKConnSetStr(FConnID, kcaPeerAddr, Addr, ALength); }
   long           SetPeerAddr(const KYString& Addr)
                  { return SetPeerAddr((char*)Addr, Addr.Length()); }
   long           SetPeerPort(long APort)
                  { return RCKConnSetInt(FConnID, kcaPeerPort, APort); }

   long           SetKeepTimeout(long ATimeout)
                  { return RCKConnSetInt(FConnID, kcaKeepTimeout, ATimeout); }
   long           SetKeepInterval(long AInterval)
                  { return RCKConnSetInt(FConnID, kcaKeepInterval, AInterval); }
   long           SetKeepRetryTimes(long ARetryTimes)
                  { return RCKConnSetInt(FConnID, kcaKeepRetryTimes, ARetryTimes); }

   // slot 扩展属性
   bool           SlotExtBool(long AExt) const
                  { return RCKConnGetInt(FConnID, kcaBaseSlotExt + AExt, NULL) == 1; }
   long           SlotExtInt(long AExt) const
                  { return RCKConnGetInt(FConnID, kcaBaseSlotExt + AExt, NULL); }
   void*          SlotExtObj(long AExt) const
                  { return RCKConnGetObj(FConnID, kcaBaseSlotExt + AExt, NULL); }
   char*          SlotExtStr(long AExt, long* ARetSize = NULL) const
                  { return RCKConnGetStr(FConnID, kcaBaseSlotExt + AExt, ARetSize); }

   // 设置 slot 扩展属性
   long           SetSlotExtInt(long AExt, long AValue)
                  { return RCKConnSetInt(FConnID, kcaBaseSlotExt + AExt, AValue); }
   long           SetSlotExtObj(long AExt, void* AValue)
                  { return RCKConnSetObj(FConnID, kcaBaseSlotExt + AExt, AValue); }
   long           SetSlotExtStr(long AExt, const char* AValue, long ASize)
                  { return RCKConnSetStr(FConnID, kcaBaseSlotExt + AExt, AValue, ASize); }

   // 打开/关闭连接
   long           Open()               { return RCKConnOpen(FConnID); }
   long           Close()              { return RCKConnClose(FConnID); }

   // 登录/登出对端应用
   long           Login()              { return RCKConnLogin(FConnID); }
   long           Logout()             { return RCKConnLogout(FConnID); }

   // 加载对端应用的函数列表
   long           LoadDefs()           { return RCKConnLoad(FConnID); }

   // 发送数据(参数 ANeedPack 表示数据是否需要压缩发送)
   long           SendData(const void* AData, long ASize, bool ANeedPack)
                  { return RCKConnSendData(FConnID, AData, ASize, ANeedPack); }

   // 设置事件
   long           SetOnConnect(TDoNotify AMethod, void* AObject);
   long           SetOnDisconnect(TDoNotify AMethod, void* AObject);
   long           SetOnLogin(TDoNotify AMethod, void* AObject);
   long           SetOnLogout(TDoNotify AMethod, void* AObject);
   long           SetOnCmdReturn(TDoCmdReturn AMethod, void* AObject);
   long           SetOnRecvData(TDoRecvData AMethod, void* AObject);

protected:
   // 对象次数增/减 1
   long           IncObjTimes()        { return InterlockedIncrement(&FObjTimes); }
   long           DecObjTimes()        { return InterlockedDecrement(&FObjTimes); }

private:
   // 执行初始化事件
   void           DoInitEvent();

   // 执行事件方法
   void           DoConnect();
   void           DoDisconnect();
   void           DoLogin();
   void           DoLogout();
   void           DoCmdReturn(void* ACmdID, long AResult);
   void           DoRecvData(const void* AData, long ASize);

private:
   void*          FData;               // 自定义数据
   void*          FConnID;             // 连接 ID
   long           FObjTimes;           // 对象引用次数
   bool           FCanEvent;           // 是否能够事件(注: CreateConnObj 创建才可以)
   bool           FNeedFree;           // 是否需要释放

   // 事件
   TOnNotify      FOnConnect;          // 连接成功
   TOnNotify      FOnDisconnect;       // 断开连接
   TOnNotify      FOnLogin;            // 登录对端应用
   TOnNotify      FOnLogout;           // 登出对端应用
   TOnCmdReturn   FOnCmdReturn;        // 命令返回
   TOnRecvData    FOnRecvData;         // 接收数据

private:
   // 连接事件的回调函数
   static void __stdcall _RCKOnConnect(void* AConnID);
   static void __stdcall _RCKOnDisconnect(void* AConnID);
   static void __stdcall _RCKOnLogin(void* AConnID);
   static void __stdcall _RCKOnLogout(void* AConnID);
   static void __stdcall _RCKOnCmdReturn(void* AConnID, void* ACmdID, long AResult);
   static void __stdcall _RCKOnRecvData(void* AConnID, const void* AData, long ASize);

private:
   friend class TRCKObjs;
};

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/* TRCCmdObj - RCK 命令类 */

class TRCCmdObj
{
public:
   TRCCmdObj();
   virtual ~TRCCmdObj();

   // 属性
   void*          Data() const         { return FData; }
   KYString       Name() const         { return RCKCmdGetStr(FCmdID, kmaName, NULL); }
   long           State() const        { return RCKCmdGetInt(FCmdID, kmaState, NULL); }
   void*          CmdID() const        { return FCmdID; }
   void*          ConnID() const       { return RCKCmdGetObj(FCmdID, kmaConnObj, NULL); }
   TRCConnObj*    ConnObj() const;
   long           RetType() const      { return RCKCmdGetInt(FCmdID, kmaRetType, NULL); }
   long           RetSize() const      { return RCKCmdGetInt(FCmdID, kmaRetSize, NULL); }
   bool           Encrypted() const    { return RCKCmdGetInt(FCmdID, kmaEncrypted, NULL) == 1; }
   bool           AppIsValid() const   { return RCKCmdGetInt(FCmdID, kmaAppIsValid, NULL) == 1; }
   long           ExecResult() const   { return RCKCmdGetInt(FCmdID, kmaExecResult, NULL); }

   // 读取参数定义
   long           ParamCount() const   { return RCKCmdGetInt(FCmdID, kmaParamCount, NULL); }
   long           ParamIndex(const char* AName) const
                  { return RCKCmdParamIndex(FCmdID, AName); }
   long           ParamIndex(const KYString& AName) const
                  { return RCKCmdParamIndex(FCmdID, (char*)AName); }
   KYString       ParamName(long AIndex) const
                  { return RCKCmdGetStr(FCmdID, kmaBaseParamName + AIndex, NULL); }
   long           ParamType(long AIndex) const
                  { return RCKCmdGetInt(FCmdID, kmaBaseParamType + AIndex, NULL); }
   long           ParamSize(long AIndex) const
                  { return RCKCmdGetInt(FCmdID, kmaBaseParamSize + AIndex, NULL); }

   // 读取返回字段定义
   long           FieldCount() const   { return RCKCmdGetInt(FCmdID, kmaFieldCount, NULL); }
   long           FieldIndex(const char* AName) const
                  { return RCKCmdFieldIndex(FCmdID, AName); }
   long           FieldIndex(const KYString& AName) const
                  { return RCKCmdFieldIndex(FCmdID, (char*)AName); }
   KYString       FieldName(long AIndex) const
                  { return RCKCmdGetStr(FCmdID, kmaBaseFieldName + AIndex, NULL); }
   long           FieldType(long AIndex) const
                  { return RCKCmdGetInt(FCmdID, kmaBaseFieldType + AIndex, NULL); }
   long           FieldSize(long AIndex) const
                  { return RCKCmdGetInt(FCmdID, kmaBaseFieldSize + AIndex, NULL); }
   bool           FieldIsNull(long AIndex) const
                  { return RCKCmdFieldIsNull(FCmdID, AIndex, NULL); }
   bool           FieldIsNull(const char* AName) const
                  { return RCKCmdFieldIsNull_(FCmdID, AName, NULL); }
   bool           FieldIsNull(const KYString& AName) const
                  { return RCKCmdFieldIsNull_(FCmdID, (char*)AName, NULL); }

   // 设置属性
   void           SetData(void* AData) { FData = AData; }
   long           SetConnID(void* AConnID) const
                  { return RCKCmdSetObj(FCmdID, kmaConnObj, AConnID); }
   long           SetConnObj(TRCConnObj* AConnObj) const
                  { return RCKCmdSetObj(FCmdID, kmaConnObj, (AConnObj != NULL)
                                                   ? AConnObj->ConnID() : NULL); }

   // 开始命令
   long           Begin(const char* AName) const
                  { return RCKCmdBegin(FCmdID, AName); }
   long           Begin(const KYString& AName) const
                  { return RCKCmdBegin(FCmdID, (char*)AName); }

   // 结束命令/重新开始命令
   long           End() const          { return RCKCmdEnd(FCmdID); }
   long           Restart() const      { return RCKCmdRestart(FCmdID); }

   // 执行命令
   long           Execute(Longword ATimeout) const
                  { return RCKCmdExecute(FCmdID, ATimeout); }
   long           ExecByParams(Longword ATimeout, ...) const;

   // 清除当前命令参数值
   long           ParamClear() const   { return RCKCmdParamClear(FCmdID); }

   // 设置各类型参数值的相关方法
   long           ParamByStr(long AIndex, const char* AValue, long ASize = -1) const
                  { return RCKCmdParamByStr(FCmdID, AIndex, AValue, ASize); }
   long           ParamByStr(long AIndex, const KYString& AValue) const
                  { return RCKCmdParamByStr(FCmdID, AIndex, (char*)AValue, AValue.Length()); }
   long           ParamByStr(const char* AName, const KYString& AValue) const
                  { return RCKCmdParamByStr_(FCmdID, AName, (char*)AValue, AValue.Length()); }
   long           ParamByStr(const KYString& AName, const KYString& AValue) const
                  { return RCKCmdParamByStr_(FCmdID, (char*)AName,
                                             (char*)AValue, AValue.Length()); }

   long           ParamByInt(long AIndex, long AValue) const
                  { return RCKCmdParamByInt(FCmdID, AIndex, AValue); }
   long           ParamByInt(const char* AName, long AValue) const
                  { return RCKCmdParamByInt_(FCmdID, AName, AValue); }
   long           ParamByInt(const KYString& AName, long AValue) const
                  { return RCKCmdParamByInt_(FCmdID, (char*)AName, AValue); }

   long           ParamByBool(long AIndex, bool AValue) const
                  { return RCKCmdParamByBool(FCmdID, AIndex, AValue); }
   long           ParamByBool(const char* AName, bool AValue) const
                  { return RCKCmdParamByBool_(FCmdID, AName, AValue); }
   long           ParamByBool(const KYString& AName, bool AValue) const
                  { return RCKCmdParamByBool_(FCmdID, (char*)AName, AValue); }

   long           ParamByFloat(long AIndex, double AValue) const
                  { return RCKCmdParamByFloat(FCmdID, AIndex, AValue); }
   long           ParamByFloat(const char* AName, double AValue) const
                  { return RCKCmdParamByFloat_(FCmdID, AName, AValue); }
   long           ParamByFloat(const KYString& AName, double AValue) const
                  { return RCKCmdParamByFloat_(FCmdID, (char*)AName, AValue); }

   long           ParamByStruct(long AIndex, void* AValue) const
                  { return RCKCmdParamByStruct(FCmdID, AIndex, AValue); }
   long           ParamByStruct(const char* AName, void* AValue) const
                  { return RCKCmdParamByStruct_(FCmdID, AName, AValue); }
   long           ParamByStruct(const KYString& AName, void* AValue) const
                  { return RCKCmdParamByStruct_(FCmdID, (char*)AName, AValue); }

   long           ParamByInt64(long AIndex, __int64 AValue) const
                  { return RCKCmdParamByInt64(FCmdID, AIndex, AValue); }
   long           ParamByInt64(const char* AName, __int64 AValue) const
                  { return RCKCmdParamByInt64_(FCmdID, AName, AValue); }
   long           ParamByInt64(const KYString& AName, __int64 AValue) const
                  { return RCKCmdParamByInt64_(FCmdID, (char*)AName, AValue); }

   long           ParamByDate(long AIndex, TDateTime AValue) const
                  { return RCKCmdParamByDate(FCmdID, AIndex, AValue); }
   long           ParamByDate(const char* AName, TDateTime AValue) const
                  { return RCKCmdParamByDate_(FCmdID, AName, AValue); }
   long           ParamByDate(const KYString& AName, TDateTime AValue) const
                  { return RCKCmdParamByDate_(FCmdID, (char*)AName, AValue); }

   long           ParamByCustom(long AIndex, const void* AValue, long ASize) const
                  { return RCKCmdParamByCustom(FCmdID, AIndex, AValue, ASize); }
   long           ParamByCustom(const char* AName, const void* AValue, long ASize) const
                  { return RCKCmdParamByCustom_(FCmdID, AName, AValue, ASize); }
   long           ParamByCustom(const KYString& AName, const void* AValue, long ASize) const
                  { return RCKCmdParamByCustom_(FCmdID, (char*)AName, AValue, ASize); }

   // 取各类型返回值的相关方法
   KYString       RetAsStr() const;
   char*          RetAsStr(long& ASize) const
                  { return RCKCmdRetStr(FCmdID, &ASize); }
   long           RetAsInt() const     { return RCKCmdRetInt(FCmdID, NULL); }
   bool           RetAsBool() const    { return RCKCmdRetBool(FCmdID, NULL); }
   double         RetAsFloat() const   { return RCKCmdRetFloat(FCmdID, NULL); }
   void*          RetAsStruct() const  { return RCKCmdRetStruct(FCmdID, NULL); }
   __int64        RetAsInt64() const   { return RCKCmdRetInt64(FCmdID, NULL); }
   TDateTime      RetAsDate() const    { return RCKCmdRetDate(FCmdID, NULL); }
   long           RetAsCustom(void* AValue, long ASize) const
                  { return RCKCmdRetCustom(FCmdID, AValue, ASize); }

   // 取各类型返回字段值的相关方法
   KYString       FieldAsStr(long AIndex) const;
   KYString       FieldAsStr(const char* AName) const;
   KYString       FieldAsStr(const KYString& AName) const
                  { return FieldAsStr((char*)AName); }
   char*          FieldAsStr(long AIndex, long& ASize) const
                  { return RCKCmdFieldStr(FCmdID, AIndex, &ASize); }
   char*          FieldAsStr(const char* AName, long& ASize) const
                  { return RCKCmdFieldStr_(FCmdID, AName, &ASize); }

   long           FieldAsInt(long AIndex) const
                  { return RCKCmdFieldInt(FCmdID, AIndex, NULL); }
   long           FieldAsInt(const char* AName) const
                  { return RCKCmdFieldInt_(FCmdID, AName, NULL); }
   long           FieldAsInt(const KYString& AName) const
                  { return RCKCmdFieldInt_(FCmdID, (char*)AName, NULL); }

   bool           FieldAsBool(long AIndex) const
                  { return RCKCmdFieldBool(FCmdID, AIndex, NULL); }
   bool           FieldAsBool(const char* AName) const
                  { return RCKCmdFieldBool_(FCmdID, AName, NULL); }
   bool           FieldAsBool(const KYString& AName) const
                  { return RCKCmdFieldBool_(FCmdID, (char*)AName, NULL); }

   double         FieldAsFloat(long AIndex) const
                  { return RCKCmdFieldFloat(FCmdID, AIndex, NULL); }
   double         FieldAsFloat(const char* AName) const
                  { return RCKCmdFieldFloat_(FCmdID, AName, NULL); }
   double         FieldAsFloat(const KYString& AName) const
                  { return RCKCmdFieldFloat_(FCmdID, (char*)AName, NULL); }

   void*          FieldAsStruct(long AIndex) const
                  { return RCKCmdFieldStruct(FCmdID, AIndex, NULL); }
   void*          FieldAsStruct(const char* AName) const
                  { return RCKCmdFieldStruct_(FCmdID, AName, NULL); }
   void*          FieldAsStruct(const KYString& AName) const
                  { return RCKCmdFieldStruct_(FCmdID, (char*)AName, NULL); }

   __int64        FieldAsInt64(long AIndex) const
                  { return RCKCmdFieldInt64(FCmdID, AIndex, NULL); }
   __int64        FieldAsInt64(const char* AName) const
                  { return RCKCmdFieldInt64_(FCmdID, AName, NULL); }
   __int64        FieldAsInt64(const KYString& AName) const
                  { return RCKCmdFieldInt64_(FCmdID, (char*)AName, NULL); }

   TDateTime      FieldAsDate(long AIndex) const
                  { return RCKCmdFieldDate(FCmdID, AIndex, NULL); }
   TDateTime      FieldAsDate(const char* AName) const
                  { return RCKCmdFieldDate_(FCmdID, AName, NULL); }
   TDateTime      FieldAsDate(const KYString& AName) const
                  { return RCKCmdFieldDate_(FCmdID, (char*)AName, NULL); }

   long           FieldAsCustom(long AIndex, void* AValue, long ASize) const
                  { return RCKCmdFieldCustom(FCmdID, AIndex, AValue, ASize); }
   long           FieldAsCustom(const char* AName, void* AValue, long ASize) const
                  { return RCKCmdFieldCustom_(FCmdID, AName, AValue, ASize); }
   long           FieldAsCustom(const KYString& AName, void* AValue, long ASize) const
                  { return RCKCmdFieldCustom_(FCmdID, (char*)AName, AValue, ASize); }

private:
   void*          FData;               // 自定义数据
   void*          FCmdID;              // 命令 ID
};

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/* TRCResp - RCK 应答类 */

class TRCResp
{
public:
   // 属性
   static long       State()              { return RCKRespState(); }
   static void*      FuncID()             { return RCKRespFuncObj(); }
   static void*      ConnID()             { return RCKRespConnObj(); }

   // 取各类型返回值的相关方法
   static KYString   RetAsStr();
   static char*      RetAsStr(long& ASize){ return RCKRespRetStr(&ASize); }
   static long       RetAsInt()           { return RCKRespRetInt(NULL); }
   static bool       RetAsBool()          { return RCKRespRetBool(NULL); }
   static double     RetAsFloat()         { return RCKRespRetFloat(NULL); }
   static void*      RetAsStruct()        { return RCKRespRetStruct(NULL); }
   static __int64    RetAsInt64()         { return RCKRespRetInt64(NULL); }
   static TDateTime  RetAsDate()          { return RCKRespRetDate(NULL); }
   static long       RetAsCustom(void* AValue, long ASize)
                     { return RCKRespRetCustom(AValue, ASize); }

   // 取各类型返回字段值的相关方法
   static KYString   FieldAsStr(long AIndex);
   static KYString   FieldAsStr(const char* AName);
   static KYString   FieldAsStr(const KYString& AName)
                     { return FieldAsStr((char*)AName); }
   static char*      FieldAsStr(long AIndex, long& ASize)
                     { return RCKRespFieldStr(AIndex, &ASize); }
   static char*      FieldAsStr(const char* AName, long& ASize)
                     { return RCKRespFieldStr_(AName, &ASize); }

   static long       FieldAsInt(long AIndex)
                     { return RCKRespFieldInt(AIndex, NULL); }
   static long       FieldAsInt(const char* AName)
                     { return RCKRespFieldInt_(AName, NULL); }
   static long       FieldAsInt(const KYString& AName)
                     { return RCKRespFieldInt_((char*)AName, NULL); }

   static bool       FieldAsBool(long AIndex)
                     { return RCKRespFieldBool(AIndex, NULL); }
   static bool       FieldAsBool(const char* AName)
                     { return RCKRespFieldBool_(AName, NULL); }
   static bool       FieldAsBool(const KYString& AName)
                     { return RCKRespFieldBool_((char*)AName, NULL); }

   static double     FieldAsFloat(long AIndex)
                     { return RCKRespFieldFloat(AIndex, NULL); }
   static double     FieldAsFloat(const char* AName)
                     { return RCKRespFieldFloat_(AName, NULL); }
   static double     FieldAsFloat(const KYString& AName)
                     { return RCKRespFieldFloat_((char*)AName, NULL); }

   static void*      FieldAsStruct(long AIndex)
                     { return RCKRespFieldStruct(AIndex, NULL); }
   static void*      FieldAsStruct(const char* AName)
                     { return RCKRespFieldStruct_(AName, NULL); }
   static void*      FieldAsStruct(const KYString& AName)
                     { return RCKRespFieldStruct_((char*)AName, NULL); }

   static __int64    FieldAsInt64(long AIndex)
                     { return RCKRespFieldInt64(AIndex, NULL); }
   static __int64    FieldAsInt64(const char* AName)
                     { return RCKRespFieldInt64_(AName, NULL); }
   static __int64    FieldAsInt64(const KYString& AName)
                     { return RCKRespFieldInt64_((char*)AName, NULL); }

   static TDateTime  FieldAsDate(long AIndex)
                     { return RCKRespFieldDate(AIndex, NULL); }
   static TDateTime  FieldAsDate(const char* AName)
                     { return RCKRespFieldDate_(AName, NULL); }
   static TDateTime  FieldAsDate(const KYString& AName)
                     { return RCKRespFieldDate_((char*)AName, NULL); }

   static long       FieldAsCustom(long AIndex, void* AValue, long ASize)
                     { return RCKRespFieldCustom(AIndex, AValue, ASize); }
   static long       FieldAsCustom(const char* AName, void* AValue, long ASize)
                     { return RCKRespFieldCustom_(AName, AValue, ASize); }
   static long       FieldAsCustom(const KYString& AName, void* AValue, long ASize)
                     { return RCKRespFieldCustom_((char*)AName, AValue, ASize); }

   // 取各类型参数值的相关方法
   static KYString   ParamAsStr(long AIndex);
   static KYString   ParamAsStr(const char* AName);
   static KYString   ParamAsStr(const KYString& AName)
                     { return ParamAsStr((char*)AName); }
   static char*      ParamAsStr(long AIndex, long& ASize)
                     { return RCKRespParamStr(AIndex, &ASize); }
   static char*      ParamAsStr(const char* AName, long& ASize)
                     { return RCKRespParamStr_(AName, &ASize); }

   static long       ParamAsInt(long AIndex)
                     { return RCKRespParamInt(AIndex, NULL); }
   static long       ParamAsInt(const char* AName)
                     { return RCKRespParamInt_(AName, NULL); }
   static long       ParamAsInt(const KYString& AName)
                     { return RCKRespParamInt_((char*)AName, NULL); }

   static bool       ParamAsBool(long AIndex)
                     { return RCKRespParamBool(AIndex, NULL); }
   static bool       ParamAsBool(const char* AName)
                     { return RCKRespParamBool_(AName, NULL); }
   static bool       ParamAsBool(const KYString& AName)
                     { return RCKRespParamBool_((char*)AName, NULL); }

   static double     ParamAsFloat(long AIndex)
                     { return RCKRespParamFloat(AIndex, NULL); }
   static double     ParamAsFloat(const char* AName)
                     { return RCKRespParamFloat_(AName, NULL); }
   static double     ParamAsFloat(const KYString& AName)
                     { return RCKRespParamFloat_((char*)AName, NULL); }

   static void*      ParamAsStruct(long AIndex)
                     { return RCKRespParamStruct(AIndex, NULL); }
   static void*      ParamAsStruct(const char* AName)
                     { return RCKRespParamStruct_(AName, NULL); }
   static void*      ParamAsStruct(const KYString& AName)
                     { return RCKRespParamStruct_((char*)AName, NULL); }

   static __int64    ParamAsInt64(long AIndex)
                     { return RCKRespParamInt64(AIndex, NULL); }
   static __int64    ParamAsInt64(const char* AName)
                     { return RCKRespParamInt64_(AName, NULL); }
   static __int64    ParamAsInt64(const KYString& AName)
                     { return RCKRespParamInt64_((char*)AName, NULL); }

   static TDateTime  ParamAsDate(long AIndex)
                     { return RCKRespParamDate(AIndex, NULL); }
   static TDateTime  ParamAsDate(const char* AName)
                     { return RCKRespParamDate_(AName, NULL); }
   static TDateTime  ParamAsDate(const KYString& AName)
                     { return RCKRespParamDate_((char*)AName, NULL); }

   static long       ParamAsCustom(long AIndex, void* AValue, long ASize)
                     { return RCKRespParamCustom(AIndex, AValue, ASize); }
   static long       ParamAsCustom(const char* AName, void* AValue, long ASize)
                     { return RCKRespParamCustom_(AName, AValue, ASize); }
   static long       ParamAsCustom(const KYString& AName, void* AValue, long ASize)
                     { return RCKRespParamCustom_((char*)AName, AValue, ASize); }

   // 设置各类型返回值的相关方法
   static long       RetByStr(const char* AValue, long ASize = -1)
                     { return RCKRespRetByStr(AValue, ASize); }
   static long       RetByStr(const KYString& AValue)
                     { return RCKRespRetByStr((char*)AValue, AValue.Length()); }
   static long       RetByInt(long AValue)
                     { return RCKRespRetByInt(AValue); }
   static long       RetByBool(bool AValue)
                     { return RCKRespRetByBool(AValue); }
   static long       RetByFloat(double AValue)
                     { return RCKRespRetByFloat(AValue); }
   static long       RetByStruct(void* AValue)
                     { return RCKRespRetByStruct(AValue); }
   static long       RetByInt64(__int64 AValue)
                     { return RCKRespRetByInt64(AValue); }
   static long       RetByDate(TDateTime AValue)
                     { return RCKRespRetByDate(AValue); }
   static long       RetByCustom(const void* AValue, long ASize)
                     { return RCKRespRetByCustom(AValue, ASize); }

   // 设置各类型返回字段值的相关方法
   static long       FieldByStr(long AIndex, const char* AValue, long ASize = -1)
                     { return RCKRespFieldByStr(AIndex, AValue, ASize); }
   static long       FieldByStr(long AIndex, const KYString& AValue)
                     { return RCKRespFieldByStr(AIndex, (char*)AValue, AValue.Length()); }
   static long       FieldByStr(const char* AName, const KYString& AValue)
                     { return RCKRespFieldByStr_(AName, (char*)AValue, AValue.Length()); }
   static long       FieldByStr(const KYString& AName, const KYString& AValue)
                     { return RCKRespFieldByStr_((char*)AName,
                                                (char*)AValue, AValue.Length()); }

   static long       FieldByInt(long AIndex, long AValue)
                     { return RCKRespFieldByInt(AIndex, AValue); }
   static long       FieldByInt(const char* AName, long AValue)
                     { return RCKRespFieldByInt_(AName, AValue); }
   static long       FieldByInt(const KYString& AName, long AValue)
                     { return RCKRespFieldByInt_((char*)AName, AValue); }

   static long       FieldByBool(long AIndex, bool AValue)
                     { return RCKRespFieldByBool(AIndex, AValue); }
   static long       FieldByBool(const char* AName, bool AValue)
                     { return RCKRespFieldByBool_(AName, AValue); }
   static long       FieldByBool(const KYString& AName, bool AValue)
                     { return RCKRespFieldByBool_((char*)AName, AValue); }

   static long       FieldByFloat(long AIndex, double AValue)
                     { return RCKRespFieldByFloat(AIndex, AValue); }
   static long       FieldByFloat(const char* AName, double AValue)
                     { return RCKRespFieldByFloat_(AName, AValue); }
   static long       FieldByFloat(const KYString& AName, double AValue)
                     { return RCKRespFieldByFloat_((char*)AName, AValue); }

   static long       FieldByStruct(long AIndex, void* AValue)
                     { return RCKRespFieldByStruct(AIndex, AValue); }
   static long       FieldByStruct(const char* AName, void* AValue)
                     { return RCKRespFieldByStruct_(AName, AValue); }
   static long       FieldByStruct(const KYString& AName, void* AValue)
                     { return RCKRespFieldByStruct_((char*)AName, AValue); }

   static long       FieldByInt64(long AIndex, __int64 AValue)
                     { return RCKRespFieldByInt64(AIndex, AValue); }
   static long       FieldByInt64(const char* AName, __int64 AValue)
                     { return RCKRespFieldByInt64_(AName, AValue); }
   static long       FieldByInt64(const KYString& AName, __int64 AValue)
                     { return RCKRespFieldByInt64_((char*)AName, AValue); }

   static long       FieldByDate(long AIndex, TDateTime AValue)
                     { return RCKRespFieldByDate(AIndex, AValue); }
   static long       FieldByDate(const char* AName, TDateTime AValue)
                     { return RCKRespFieldByDate_(AName, AValue); }
   static long       FieldByDate(const KYString& AName, TDateTime AValue)
                     { return RCKRespFieldByDate_((char*)AName, AValue); }

   static long       FieldByCustom(long AIndex, const void* AValue, long ASize)
                     { return RCKRespFieldByCustom(AIndex, AValue, ASize); }
   static long       FieldByCustom(const char* AName, const void* AValue, long ASize)
                     { return RCKRespFieldByCustom_(AName, AValue, ASize); }
   static long       FieldByCustom(const KYString& AName, const void* AValue, long ASize)
                     { return RCKRespFieldByCustom_((char*)AName, AValue, ASize); }
};

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/* TRCFields - RCK 字段集类 */

class TRCFields
{
public:
   TRCFields();
   TRCFields(void* AFields);
   virtual ~TRCFields();

   // 属性
   void*          Fields() const       { return FFields; }
   bool           IsBound() const      { return FIsBound; }

   // 字段信息
   long           Count() const        { return RCKFieldCount(FFields); }
   KYString       Name(long AIndex) const
                  { return RCKFieldName(FFields, AIndex); }
   long           Size(long AIndex) const
                  { return RCKFieldSize(FFields, AIndex); }
   long           DefSize(long AIndex) const
                  { return RCKFieldDefSize(FFields, AIndex); }
   long           FieldType(long AIndex) const
                  { return RCKFieldType(FFields, AIndex); }
   bool           IsNull(long AIndex) const
                  { return RCKFieldIsNull(FFields, AIndex, NULL); }
   bool           IsNull_(const KYString& AName) const
                  { return RCKFieldIsNull_(FFields, (char*)AName, NULL); }

   // 字段名索引
   long           IndexOf(const char* AName) const
                  { return RCKFieldIndex(FFields, AName); }
   long           IndexOf(const KYString& AName) const
                  { return RCKFieldIndex(FFields, (char*)AName); }

   // 字段定义方法
   long           AddDef(const char* AName, long AType, long ASize) const
                  { return RCKFieldDefsAdd(FFields, AName, AType, ASize); }
   long           AddDef(const KYString& AName, long AType, long ASize) const
                  { return RCKFieldDefsAdd(FFields, (char*)AName, AType, ASize); }
   void           DeleteDef(long AIndex) const
                  { RCKFieldDefsDelete(FFields, AIndex); }
   void           ClearDefs() const    { RCKFieldDefsClear(FFields); }

   long           AssignDefs(const void* AFieldDefs, long ASize) const
                  { return RCKFieldDefsAssign(FFields, AFieldDefs, ASize); }
   KYString       FieldDefs() const;
   void*          FieldDefs(long& ASize) const
                  { return RCKFieldDefsOutput(FFields, &ASize); }
   long           Defs2Size(const void* AFieldDefs) const
                  { return RCKFieldDefsSize(AFieldDefs); }

   // 字段数据方法
   void           Clear() const        { RCKFieldsClear(FFields); }
   long           Assign(const void* AData, long ASize) const
                  { return RCKFieldsAssign(FFields, AData, ASize); }
   KYString       DataSet() const;
   void*          DataSet(long& ASize) const
                  { return RCKFieldsOutput(FFields, &ASize); }
   long           DataSize() const     { return RCKFieldsSize(FFields); }

   // 取各类型字段值的相关方法
   KYString       AsStr(long AIndex) const;
   KYString       AsStr(const char* AName) const;
   KYString       AsStr(const KYString& AName) const
                  { return AsStr((char*)AName); }
   char*          AsStr(long AIndex, long& ASize) const
                  { return RCKFieldAsStr(FFields, AIndex, &ASize); }
   char*          AsStr(const char* AName, long& ASize) const
                  { return RCKFieldAsStr_(FFields, AName, &ASize); }

   long           AsInt(long AIndex) const
                  { return RCKFieldAsInt(FFields, AIndex, NULL); }
   long           AsInt(const char* AName) const
                  { return RCKFieldAsInt_(FFields, AName, NULL); }
   long           AsInt(const KYString& AName) const
                  { return RCKFieldAsInt_(FFields, (char*)AName, NULL); }

   bool           AsBool(long AIndex) const
                  { return RCKFieldAsBool(FFields, AIndex, NULL); }
   bool           AsBool(const char* AName) const
                  { return RCKFieldAsBool_(FFields, AName, NULL); }
   bool           AsBool(const KYString& AName) const
                  { return RCKFieldAsBool_(FFields, (char*)AName, NULL); }

   double         AsFloat(long AIndex) const
                  { return RCKFieldAsFloat(FFields, AIndex, NULL); }
   double         AsFloat(const char* AName) const
                  { return RCKFieldAsFloat_(FFields, AName, NULL); }
   double         AsFloat(const KYString& AName) const
                  { return RCKFieldAsFloat_(FFields, (char*)AName, NULL); }

   void*          AsStruct(long AIndex) const
                  { return RCKFieldAsStruct(FFields, AIndex, NULL); }
   void*          AsStruct(const char* AName) const
                  { return RCKFieldAsStruct_(FFields, AName, NULL); }
   void*          AsStruct(const KYString& AName) const
                  { return RCKFieldAsStruct_(FFields, (char*)AName, NULL); }

   __int64        AsInt64(long AIndex) const
                  { return RCKFieldAsInt64(FFields, AIndex, NULL); }
   __int64        AsInt64(const char* AName) const
                  { return RCKFieldAsInt64_(FFields, AName, NULL); }
   __int64        AsInt64(const KYString& AName) const
                  { return RCKFieldAsInt64_(FFields, (char*)AName, NULL); }

   TDateTime      AsDate(long AIndex) const
                  { return RCKFieldAsDate(FFields, AIndex, NULL); }
   TDateTime      AsDate(const char* AName) const
                  { return RCKFieldAsDate_(FFields, AName, NULL); }
   TDateTime      AsDate(const KYString& AName) const
                  { return RCKFieldAsDate_(FFields, (char*)AName, NULL); }

   long           AsCustom(long AIndex, void* AValue, long ASize) const
                  { return RCKFieldGetCustom(FFields, AIndex, AValue, ASize); }
   long           AsCustom(const char* AName, void* AValue, long ASize) const
                  { return RCKFieldGetCustom_(FFields, AName, AValue, ASize); }
   long           AsCustom(const KYString& AName, void* AValue, long ASize) const
                  { return RCKFieldGetCustom_(FFields, (char*)AName, AValue, ASize); }

   // 设置各类型字段值的相关方法
   long           ByStr(long AIndex, const char* AValue, long ASize = -1) const
                  { return RCKFieldByStr(FFields, AIndex, AValue, ASize); }
   long           ByStr(long AIndex, const KYString& AValue) const
                  { return RCKFieldByStr(FFields, AIndex, (char*)AValue, AValue.Length()); }
   long           ByStr(const char* AName, const KYString& AValue) const
                  { return RCKFieldByStr_(FFields, AName, (char*)AValue, AValue.Length()); }
   long           ByStr(const KYString& AName, const KYString& AValue) const
                  { return RCKFieldByStr_(FFields, (char*)AName,
                                             (char*)AValue, AValue.Length()); }

   long           ByInt(long AIndex, long AValue) const
                  { return RCKFieldByInt(FFields, AIndex, AValue); }
   long           ByInt(const char* AName, long AValue) const
                  { return RCKFieldByInt_(FFields, AName, AValue); }
   long           ByInt(const KYString& AName, long AValue) const
                  { return RCKFieldByInt_(FFields, (char*)AName, AValue); }

   long           ByBool(long AIndex, bool AValue) const
                  { return RCKFieldByBool(FFields, AIndex, AValue); }
   long           ByBool(const char* AName, bool AValue) const
                  { return RCKFieldByBool_(FFields, AName, AValue); }
   long           ByBool(const KYString& AName, bool AValue) const
                  { return RCKFieldByBool_(FFields, (char*)AName, AValue); }

   long           ByFloat(long AIndex, double AValue) const
                  { return RCKFieldByFloat(FFields, AIndex, AValue); }
   long           ByFloat(const char* AName, double AValue) const
                  { return RCKFieldByFloat_(FFields, AName, AValue); }
   long           ByFloat(const KYString& AName, double AValue) const
                  { return RCKFieldByFloat_(FFields, (char*)AName, AValue); }

   long           ByStruct(long AIndex, void* AValue) const
                  { return RCKFieldByStruct(FFields, AIndex, AValue); }
   long           ByStruct(const char* AName, void* AValue) const
                  { return RCKFieldByStruct_(FFields, AName, AValue); }
   long           ByStruct(const KYString& AName, void* AValue) const
                  { return RCKFieldByStruct_(FFields, (char*)AName, AValue); }

   long           ByInt64(long AIndex, __int64 AValue) const
                  { return RCKFieldByInt64(FFields, AIndex, AValue); }
   long           ByInt64(const char* AName, __int64 AValue) const
                  { return RCKFieldByInt64_(FFields, AName, AValue); }
   long           ByInt64(const KYString& AName, __int64 AValue) const
                  { return RCKFieldByInt64_(FFields, (char*)AName, AValue); }

   long           ByDate(long AIndex, TDateTime AValue) const
                  { return RCKFieldByDate(FFields, AIndex, AValue); }
   long           ByDate(const char* AName, TDateTime AValue) const
                  { return RCKFieldByDate_(FFields, AName, AValue); }
   long           ByDate(const KYString& AName, TDateTime AValue) const
                  { return RCKFieldByDate_(FFields, (char*)AName, AValue); }

   long           ByCustom(long AIndex, const void* AValue, long ASize) const
                  { return RCKFieldSetCustom(FFields, AIndex, AValue, ASize); }
   long           ByCustom(const char* AName, const void* AValue, long ASize) const
                  { return RCKFieldSetCustom_(FFields, AName, AValue, ASize); }
   long           ByCustom(const KYString& AName, const void* AValue, long ASize) const
                  { return RCKFieldSetCustom_(FFields, (char*)AName, AValue, ASize); }

private:
   void*          FFields;             // 字段集句柄
   bool           FIsBound;            // 是否绑定对象
};

/* end namespace */

   }
}

// 命名空间的别名
namespace RCKObjs = RCKernel::__object__;

#endif


封装类的源代码(RCKObjs.cpp)

 

// =======================================
// Unit   : RCKernel objects
// Version: 5.0.0.0 (build 2014.07.07)
// Author : Kyee Ye
// Email  : kyee_ye(at)126.com
// Copyright (C) Kyee workroom
// =======================================

#include "RCKObjs.h"

// 使用 RCKernel 的命名空间
namespace RCKernel
{
   namespace __object__
   {

/* begin namespace */

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/* TRCKObjs - RCK 对象集类 */

class TRCKObjs
{
private:
   // 映射列表类型
   typedef TKYMapObjKey<TRCAppObj>     TAppList;
   typedef TKYMapObjKey<TRCConnObj>    TConnList;
   typedef TKYMapObjKey<TRCFuncObj>    TFuncList;

public:
   TRCKObjs();
   virtual ~TRCKObjs();

   // 清除
   void           Clear();

   // 添加/删除函数ID
   bool           AddFuncID(void* AFuncID, TRCFuncObj* AFuncObj)
                  { return (FFuncIDs->Add(AFuncID, AFuncObj) != NULL); }
   bool           DeleteFuncID(void* AFuncID)
                  { return FFuncIDs->Delete(AFuncID); }

   // 函数ID -> 对象
   TRCFuncObj*    FuncID2Object(void* AFuncID)
                  {
                     TRCFuncObj* result = NULL;
                     FFuncIDs->Find(AFuncID, result);
                     return result;
                  }

   // 创建/释放应用对象
   TRCAppObj*     CreateAppObj(const char* AName, const char* APassword, long& ARetCode);
   void           FreeAppObj(TRCAppObj* AppObj);

   // 应用对象引用计数增 1
   TRCAppObj*     IncRefAppObj(void* AppID);
   bool           IncRefAppObj(TRCAppObj* AppObj);

   // 创建/释放连接对象(注: AConnID 必须存在)
   TRCConnObj*    CreateConnObj(void* AConnID, bool ANeedFree, long& ARetCode);
   void           FreeConnObj(TRCConnObj* AConnObj);

   // 连接对象引用计数增 1
   TRCConnObj*    IncRefConnObj(void* AConnID);
   bool           IncRefConnObj(TRCConnObj* AConnObj);

   // 创建/释放命令对象
   TRCCmdObj*     CreateCmdObj(void* AConnID = NULL);
   void           FreeCmdObj(TRCCmdObj* ACmdObj);

protected:
   // 当前锁
   void           Lock() const         { FLock->Enter(); }
   void           Unlock() const       { FLock->Leave(); }

private:
   // 拷贝并清除
   bool           DoClearAppObjs(TKYList& AList);
   bool           DoClearConnObjs(TKYList& AList);
   bool           DoClearCmdQueue(TKYList& AList);

   // 事件方法
   void           DoAppDeletion(TRCAppObj* AppObj);
   void           DoCmdDeletion(TRCCmdObj* ACmdObj);
   void           DoConnDeletion(TRCConnObj* AConnObj);

private:
   TKYCritSect*   FLock;               // 当前锁
   TAppList*      FAppIDs;             // 应用 ID 列表
   TAppList*      FAppObjs;            // 应用对象列表
   TFuncList*     FFuncIDs;            // 函数 ID 列表
   TConnList*     FConnIDs;            // 连接 ID 列表
   TConnList*     FConnObjs;           // 连接对象列表
   TKYCycQueue*   FCmdQueue;           // 命令对象队列

public:
   // 全局 RCK 对象集对象
   static TRCKObjs*     _obj()         { return _Object; }

   // 初始化/释放 _Object
   static void          _InitObj();
   static void          _FreeObj(bool AForced = false);

   // 应用对象引用计数增/减 1(注: AppObj 对象必须存在)
   static void          _IncRefAppObj(TRCAppObj* AppObj)
                        { AppObj->IncObjTimes(); }
   static void          _DecRefAppObj(TRCAppObj* AppObj)
                        { if (AppObj->DecObjTimes() == 0) delete AppObj; }

   // 连接对象引用计数增/减 1(注: AConnObj 对象必须存在)
   static void          _IncRefConnObj(TRCConnObj* AConnObj)
                        { AConnObj->IncObjTimes(); }
   static void          _DecRefConnObj(TRCConnObj* AConnObj)
                        { if (AConnObj->DecObjTimes() == 0) delete AConnObj; }

private:
   // 全局 RCK 对象集对象
   static TKYCritSect*  _Lock;
   static TRCKObjs*     _Object;
   static long          _RefCount;

   // TRCKObjs 的静态成员初始化类
   static class TInitialization
   {
   public:
      TInitialization();
      ~TInitialization();
   } _Initialization;

   friend class TInitialization;
};

/* TRCKObjs - RCK 对象集类 */

// ---------------- 静态成员 ----------------

// 全局锁对象
TKYCritSect*   TRCKObjs::_Lock      = NULL;
TRCKObjs*      TRCKObjs::_Object    = NULL;
long           TRCKObjs::_RefCount  = 0;

// TRCKObjs 的静态成员初始化对象
TRCKObjs::TInitialization TRCKObjs::_Initialization;

// ---------------- 静态函数 ----------------
// TRCKObjs 的静态成员初始化类的构造函数
TRCKObjs::TInitialization::TInitialization()
{
   // 初始化
   _RefCount   = 0;
   _Object     = NULL;

   // 创建对象
   _Lock       = new TKYCritSect;
}

// TRCKObjs 的静态成员初始化类的析构函数
TRCKObjs::TInitialization::~TInitialization()
{
   // 释放对象
   FreeAndNil(_Lock);
   FreeAndNil(_Object);
}

// 初始化 _Object
void TRCKObjs::_InitObj()
{
   _Lock->Enter();
   if (_RefCount == 0)
      try
      {
         // 创建对象并引用计数设为 1
         _Object     = new TRCKObjs;
         _RefCount   = 1;

         // 初始化 RCKernel 接口
         RCKInitialize();
      }
      catch (...) {}
   else
      _RefCount++;
   _Lock->Leave();
}

// 释放 _Object
void TRCKObjs::_FreeObj(bool AForced)
{
   _Lock->Enter();
   if (_RefCount > 0)
      try
      {
         // 引用计数减 1
         _RefCount--;

         // 判断是否需要释放
         if ((_RefCount == 0) || AForced)
         {
            // 引用计数设为 0
            _RefCount   = 0;

            // 清除并释放对象
            _Object->Clear();
            FreeAndNil(_Object);

            // 释放 RCKernel 接口
            RCKUninitialize();
         }
      }
      catch (...) {}
   _Lock->Leave();
}

// ---------------- 构造函数和析构函数 ----------------
// 构造函数
TRCKObjs::TRCKObjs()
{
   // 创建对象
   FLock       = new TKYCritSect;
   FAppIDs     = new TAppList(false, false);
   FAppObjs    = new TAppList(false, false);
   FFuncIDs    = new TFuncList(false, true);
   FConnIDs    = new TConnList(false, false);
   FConnObjs   = new TConnList(false, false);
   FCmdQueue   = new TKYCycQueue(0, TKYCycQueue::slPower10);

   // 设置对象属性
   FCmdQueue->SetMaxCount(FCmdQueue->CycCount());
}

// 析构函数
TRCKObjs::~TRCKObjs()
{
   // 清除
   Clear();

   // 释放对象
   FreeAndNil(FLock);
   FreeAndNil(FAppIDs);
   FreeAndNil(FAppObjs);
   FreeAndNil(FFuncIDs);
   FreeAndNil(FConnIDs);
   FreeAndNil(FConnObjs);
   FreeAndNil(FCmdQueue);
}

// ---------------- 私有函数 ----------------
// 拷贝并清除应用对象列表
bool TRCKObjs::DoClearAppObjs(TKYList& AList)
{
   // 初始化
   bool result = false;

   // 检查列表是否非空
   if (FAppObjs->Count() > 0)
      try
      {
         // 更改容量
         AList.ChangeCapacity(FAppObjs->Count());

         // 循环拷贝
         void* pNode = FAppObjs->Next(NULL);
         while (pNode != NULL)
         {
            AList.Add(FAppObjs->Value(pNode));
            pNode = FAppObjs->Next(pNode);
         }

         // 清除
         FAppIDs->Clear();
         FAppObjs->Clear();

         // 返回结果
         result = true;
      }
      catch (...) {}

   // 返回结果
   return result;
}

// 拷贝并清除连接对象列表
bool TRCKObjs::DoClearConnObjs(TKYList& AList)
{
   // 初始化
   bool result = false;

   // 检查列表是否非空
   if (FConnObjs->Count() > 0)
      try
      {
         // 更改容量
         AList.ChangeCapacity(FConnObjs->Count());

         // 循环拷贝
         void* pNode = FConnObjs->Next(NULL);
         while (pNode != NULL)
         {
            AList.Add(FConnObjs->Value(pNode));
            pNode = FConnObjs->Next(pNode);
         }

         // 清除
         FConnIDs->Clear();
         FConnObjs->Clear();

         // 返回结果
         result = true;
      }
      catch (...) {}

   // 返回结果
   return result;
}

// 拷贝并清除命令对象队列
bool TRCKObjs::DoClearCmdQueue(TKYList& AList)
{
   // 初始化
   bool result = false;

   // 检查列表是否非空
   if (FCmdQueue->Count() != 0)
      try
      {
         // 初始化
         void* pData;

         // 更改容量并循环弹出队列
         AList.ChangeCapacity(FCmdQueue->Count());
         while (FCmdQueue->Pop(pData))
            AList.Add(pData);

         // 返回结果
         result = true;
      }
      catch (...) {}

   // 返回结果
   return result;
}

// 列表的 OnDeletion 事件过程
void TRCKObjs::DoAppDeletion(TRCAppObj* AppObj)
{
   _DecRefAppObj(AppObj);
}

// 列表的 OnDeletion 事件过程
void TRCKObjs::DoCmdDeletion(TRCCmdObj* ACmdObj)
{
   delete ACmdObj;
}

// 列表的 OnDeletion 事件过程
void TRCKObjs::DoConnDeletion(TRCConnObj* AConnObj)
{
   _DecRefConnObj(AConnObj);
}

// ---------------- 公有函数 ----------------
// 清除
void TRCKObjs::Clear()
{
   // 初始化
   TKYList  objApps(false);
   TKYList  objCmds(false);
   TKYList  objConns(false);
   bool     boolApp  = false;
   bool     boolCmd  = false;
   bool     boolConn = false;

   // 清除函数列表
   FFuncIDs->Clear();

   // 拷贝并清除列表
   Lock();
   {
      boolApp  = DoClearAppObjs(objApps);
      boolCmd  = DoClearCmdQueue(objCmds);
      boolConn = DoClearConnObjs(objConns);
   }
   Unlock();

   // 判断是否需要清除应用
   if (boolApp)
   {
      // 设置 OnDeletion 事件方法
      objApps.OnDeletion.Object  = this;
      objApps.OnDeletion.Method  = (TKYList::TDoDeletion)&TRCKObjs::DoAppDeletion;

      // 清除
      objApps.Clear();
   }

   // 判断是否需要清除命令
   if (boolCmd)
   {
      // 设置 OnDeletion 事件方法
      objCmds.OnDeletion.Object  = this;
      objCmds.OnDeletion.Method  = (TKYList::TDoDeletion)&TRCKObjs::DoCmdDeletion;

      // 清除
      objCmds.Clear();
   }

   // 判断是否需要清除连接
   if (boolConn)
   {
      // 设置 OnDeletion 事件方法
      objConns.OnDeletion.Object = this;
      objConns.OnDeletion.Method = (TKYList::TDoDeletion)&TRCKObjs::DoConnDeletion;

      // 清除
      objConns.Clear();
   }
}

// 创建应用对象
TRCAppObj* TRCKObjs::CreateAppObj(const char* AName, const char* APassword, long& ARetCode)
{
   // 初始化
   TRCAppObj*  result   = NULL;
   KYString    strName  = AName;
   void*       pAppID   = RCKAppCreate((char*)strName, APassword);

   // 判断是否创建成功
   if (pAppID != NULL)
   {
      ARetCode = krUnknown;

      // 创建对象, 并加入列表
      try
      {
         TRCAppObj* objApp = new TRCAppObj;
         if (objApp != NULL)
         {
            Lock();
            try
            {
               // 添加到 ID 列表
               void* pNode = FAppIDs->Add(pAppID, objApp);
               if (pNode == NULL)
               {
                  pNode = FAppIDs->Find(pAppID);
                  if (pNode != NULL)
                  {
                     FAppObjs->Delete(FAppIDs->Value(pNode));
                     FAppIDs->SetValue(pNode, objApp);
                  }
               }

               // 添加到对象列表
               if (pNode == NULL)
                  ;
               else if ((FAppObjs->Add(objApp, objApp) != NULL)
                     || FAppObjs->Existed(objApp))
               {
                  // 设置对象属性
                  objApp->FName  = strName;
                  objApp->FAppID = pAppID;
                  result         = objApp;
                  ARetCode       = krSuccess;
               }
               else
                  FAppIDs->Remove(pNode);
            }
            catch (...) {}
            Unlock();

            // 若失败则释放对象
            if (result == NULL)
               delete objApp;
         }
      }
      catch (...) {}

      // 若失败则释放
      if (result == NULL)
         RCKAppFree(pAppID);
   }
   else
      ARetCode = RCKGetLastError();

   // 返回结果
   return result;
}

// 释放应用对象
void TRCKObjs::FreeAppObj(TRCAppObj* AppObj)
{
   // 初始化
   TRCAppObj* objApp = NULL;

   // 查找并释放
   Lock();
   try
   {
      void* pNode = FAppObjs->Find(AppObj);
      if (pNode != NULL)
      {
         objApp   = FAppObjs->Value(pNode);
         FAppObjs->Remove(pNode);

         // 释放 ID 项
         pNode    = FAppIDs->Find(objApp->AppID());
         if ((pNode != NULL) && (FAppIDs->Value(pNode) == objApp))
            FAppIDs->Remove(pNode);
      }
   }
   catch (...) {}
   Unlock();

   // 若存在则引用计数减 1
   if (objApp != NULL)
      _DecRefAppObj(objApp);
}

// 应用对象引用计数增 1
TRCAppObj* TRCKObjs::IncRefAppObj(void* AppID)
{
   // 初始化
   TRCAppObj* result = NULL;

   // 查找
   Lock();
   try
   {
      void* pNode = FAppIDs->Find(AppID);
      if (pNode != NULL)
      {
         result   = FAppIDs->Value(pNode);
         result->IncObjTimes();
      }
   }
   catch (...) {}
   Unlock();

   // 返回结果
   return result;
}

// 应用对象引用计数增 1
bool TRCKObjs::IncRefAppObj(TRCAppObj* AppObj)
{
   // 初始化
   bool result = false;

   // 查找
   Lock();
   try
   {
      void* pNode = FAppObjs->Find(AppObj);
      if (pNode != NULL)
      {
         AppObj->IncObjTimes();
         result   = true;
      }
   }
   catch (...) {}
   Unlock();

   // 返回结果
   return result;
}

// 创建连接对象(注: AConnID 必须存在)
TRCConnObj* TRCKObjs::CreateConnObj(void* AConnID, bool ANeedFree, long& ARetCode)
{
   // 初始化
   TRCConnObj* result = NULL;

   // 检查连接是否存在
   RCKConnGetInt(AConnID, kcaState, &ARetCode);
   if (ARetCode == krSuccess)
   {
      ARetCode = krUnknown;

      // 创建对象, 并加入列表
      try
      {
         TRCConnObj* objConn = new TRCConnObj;
         if (objConn != NULL)
         {
            Lock();
            try
            {
               // 添加到 ID 列表
               void* pNode = FConnIDs->Add(AConnID, objConn);
               if (pNode == NULL)
               {
                  if (FConnIDs->Existed(AConnID))
                     ARetCode          = krIsExisted;
               }
               else if ((FConnObjs->Add(objConn, objConn) != NULL)
                     || FConnObjs->Existed(objConn))
               {
                  // 设置对象属性
                  objConn->FConnID     = AConnID;
                  objConn->FCanEvent   = true;
                  objConn->FNeedFree   = ANeedFree;
                  result               = objConn;
                  ARetCode             = krSuccess;
               }
               else
                  FConnIDs->Remove(pNode);
            }
            catch (...) {}
            Unlock();

            // 若失败则释放对象
            if (result == NULL)
               delete objConn;
         }
      }
      catch (...) {}
   }

   // 返回结果
   return result;
}

// 释放连接对象
void TRCKObjs::FreeConnObj(TRCConnObj* AConnObj)
{
   // 初始化
   TRCConnObj* objConn = NULL;

   // 查找并释放
   Lock();
   try
   {
      void* pNode = FConnObjs->Find(AConnObj);
      if (pNode != NULL)
      {
         objConn  = FConnObjs->Value(pNode);
         FConnObjs->Remove(pNode);

         // 释放 ID 项
         pNode    = FConnIDs->Find(objConn->ConnID());
         if ((pNode != NULL) && (FConnIDs->Value(pNode) == objConn))
            FConnIDs->Remove(pNode);
      }
   }
   catch (...) {}
   Unlock();

   // 若存在则引用计数减 1
   if (objConn != NULL)
      _DecRefConnObj(objConn);
}

// 连接对象引用计数增 1
TRCConnObj* TRCKObjs::IncRefConnObj(void* AConnID)
{
   // 初始化
   TRCConnObj* result = NULL;

   // 查找
   Lock();
   try
   {
      void* pNode = FConnIDs->Find(AConnID);
      if (pNode != NULL)
      {
         result   = FConnIDs->Value(pNode);
         result->IncObjTimes();
      }
   }
   catch (...) {}
   Unlock();

   // 返回结果
   return result;
}

// 连接对象引用计数增 1
bool TRCKObjs::IncRefConnObj(TRCConnObj* AConnObj)
{
   // 初始化
   bool result = false;

   // 查找
   Lock();
   try
   {
      void* pNode = FConnObjs->Find(AConnObj);
      if (pNode != NULL)
      {
         AConnObj->IncObjTimes();
         result   = true;
      }
   }
   catch (...) {}
   Unlock();

   // 返回结果
   return result;
}

// 创建命令对象
TRCCmdObj* TRCKObjs::CreateCmdObj(void* AConnID)
{
   // 初始化
   TRCCmdObj* result = NULL;

   // 弹出队列
   Lock();
   try
   {
      result = (TRCCmdObj*)FCmdQueue->Pop();
   }
   catch (...) {}
   Unlock();

   // 判断是否为空
   if (result == NULL)
      result = new TRCCmdObj;

   // 设置连接
   result->SetConnID(AConnID);

   // 返回结果
   return result;
}

// 释放命令对象
void TRCKObjs::FreeCmdObj(TRCCmdObj* ACmdObj)
{
   if (ACmdObj != NULL)
   {
      // 初始化
      bool boolPush = false;

      // 关闭命令
      ACmdObj->End();

      // 压入队列
      Lock();
      try
      {
         boolPush = FCmdQueue->Push(ACmdObj);
      }
      catch (...) {}
      Unlock();

      // 压入队列失败则释放对象
      if (!boolPush)
         delete ACmdObj;
   }
}

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/* 初始化/释放单元 */

// 初始化 RCKObjs 单元(注: 内部有引用计数)
void InitRCKObjs()
{
   TRCKObjs::_InitObj();
}

// 释放 RCKObjs 单元(注: 内部有引用计数)
void FreeRCKObjs(bool AForced)
{
   TRCKObjs::_FreeObj(AForced);
}

// 命令ID -> 对象
TRCCmdObj* CmdID2Object(void* ACmdID)
{
   return (TRCCmdObj*)RCKCmdGetObj(ACmdID, kmaData, NULL);
}

// 函数ID -> 对象
TRCFuncObj* FuncID2Object(void* AFuncID)
{
   // 初始化
   TRCFuncObj* result = NULL;

   // 判断是否已经初始化
   if (TRCKObjs::_obj() != NULL)
      result = TRCKObjs::_obj()->FuncID2Object(AFuncID);

   // 返回结果
   return result;
}

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/* 应用对象(TRCAppObj)的相关函数 */

// 创建应用对象
TRCAppObj* CreateAppObj(const char* AName, const char* APassword, long* ARetCode)
{
   // 初始化
   TRCAppObj* result  = NULL;
   long       intCode = krNotExist;

   // 判断是否已经初始化
   if (TRCKObjs::_obj() != NULL)
      result = TRCKObjs::_obj()->CreateAppObj(AName, APassword, intCode);

   // 设置返回码
   if (ARetCode != NULL)
      *ARetCode = intCode;

   // 返回结果
   return result;
}

// 释放应用对象
void FreeAppObj(TRCAppObj* AppObj)
{
   // 判断是否已经初始化
   if (TRCKObjs::_obj() != NULL)
      TRCKObjs::_obj()->FreeAppObj(AppObj);
}

// 应用对象引用计数增 1
TRCAppObj* IncRefAppObj(void* AppID)
{
   // 初始化
   TRCAppObj* result = NULL;

   // 判断是否已经初始化
   if (TRCKObjs::_obj() != NULL)
      result = TRCKObjs::_obj()->IncRefAppObj(AppID);

   // 返回结果
   return result;
}

// 应用对象引用计数增 1
bool IncRefAppObj_(TRCAppObj* AppObj)
{
   return (TRCKObjs::_obj() != NULL) && TRCKObjs::_obj()->IncRefAppObj(AppObj);
}

// 应用对象引用计数增 1(注: AppObj 对象必须存在)
void IncRefAppObj(TRCAppObj* AppObj)
{
   TRCKObjs::_IncRefAppObj(AppObj);
}

// 应用对象引用计数减 1(注: AppObj 对象必须存在)
void DecRefAppObj(TRCAppObj* AppObj)
{
   TRCKObjs::_DecRefAppObj(AppObj);
}

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/* 连接对象(TRCConnObj)的相关函数 */

// 创建连接对象(注: AConnID 必须存在)
TRCConnObj* CreateConnObj(void* AConnID, bool ANeedFree, long* ARetCode)
{
   // 初始化
   TRCConnObj* result  = NULL;
   long        intCode = krNotExist;

   // 判断是否已经初始化
   if (TRCKObjs::_obj() != NULL)
      result = TRCKObjs::_obj()->CreateConnObj(AConnID, ANeedFree, intCode);

   // 设置返回码
   if (ARetCode != NULL)
      *ARetCode = intCode;

   // 返回结果
   return result;
}

// 释放连接对象
void FreeConnObj(TRCConnObj* AConnObj)
{
   // 判断是否已经初始化
   if (TRCKObjs::_obj() != NULL)
      TRCKObjs::_obj()->FreeConnObj(AConnObj);
}

// 连接对象引用计数增 1
TRCConnObj* IncRefConnObj(void* AConnID)
{
   // 初始化
   TRCConnObj* result = NULL;

   // 判断是否已经初始化
   if (TRCKObjs::_obj() != NULL)
      result = TRCKObjs::_obj()->IncRefConnObj(AConnID);

   // 返回结果
   return result;
}

// 连接对象引用计数增 1
bool IncRefConnObj_(TRCConnObj* AConnObj)
{
   return (TRCKObjs::_obj() != NULL) && TRCKObjs::_obj()->IncRefConnObj(AConnObj);
}

// 连接对象引用计数增 1(注: AConnObj 对象必须存在)
void IncRefConnObj(TRCConnObj* AConnObj)
{
   TRCKObjs::_IncRefConnObj(AConnObj);
}

// 连接对象引用计数减 1(注: AConnObj 对象必须存在)
void DecRefConnObj(TRCConnObj* AConnObj)
{
   TRCKObjs::_DecRefConnObj(AConnObj);
}

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/* 命令对象(TRCCmdObj)的相关函数 */

// 创建命令对象
TRCCmdObj* CreateCmdObj(void* AConnID)
{
   // 初始化
   TRCCmdObj* result = NULL;

   // 判断是否已经初始化
   if (TRCKObjs::_obj() != NULL)
      result = TRCKObjs::_obj()->CreateCmdObj(AConnID);

   // 返回结果
   return result;
}

// 创建命令对象(注: AConnObj 必须存在)
TRCCmdObj* CreateCmdObj(TRCConnObj* AConnObj)
{
   // 初始化
   TRCCmdObj* result = NULL;

   // 判断是否已经初始化
   if (TRCKObjs::_obj() != NULL)
      result = TRCKObjs::_obj()->CreateCmdObj(AConnObj->ConnID());

   // 返回结果
   return result;
}

// 释放命令对象
void FreeCmdObj(TRCCmdObj* ACmdObj)
{
   // 判断是否已经初始化
   if (TRCKObjs::_obj() != NULL)
      TRCKObjs::_obj()->FreeCmdObj(ACmdObj);
}

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/* TRCAppObj - RCK 应用类 */

// ---------------- 静态函数 ----------------
// 应用的 OnConnLogin 回调事件
void __stdcall TRCAppObj::_RCKOnConnLogin(void* AppID, void* AConnID, bool& AIsRefused)
{
   TRCAppObj* objApp = TRCKObjs::_obj()->IncRefAppObj(AppID);
   if (objApp != NULL)
   {
      objApp->DoConnLogin(AConnID, AIsRefused);
      TRCKObjs::_DecRefAppObj(objApp);
   }
   else
      AIsRefused  = true;
}

// 应用的 OnConnLogout 回调事件
void __stdcall TRCAppObj::_RCKOnConnLogout(void* AppID, void* AConnID)
{
   TRCAppObj* objApp = TRCKObjs::_obj()->IncRefAppObj(AppID);
   if (objApp != NULL)
   {
      objApp->DoConnLogout(AConnID);
      TRCKObjs::_DecRefAppObj(objApp);
   }
}

// 应用的 OnExecResp 回调事件
void __stdcall TRCAppObj::_RCKOnExecResp(void* AppID, void* AFuncID, void* AConnID)
{
   TRCAppObj* objApp = TRCKObjs::_obj()->IncRefAppObj(AppID);
   if (objApp != NULL)
   {
      objApp->DoExecResp(AFuncID, AConnID);
      TRCKObjs::_DecRefAppObj(objApp);
   }
}

// 应用的 OnRespCancel 回调事件
void __stdcall TRCAppObj::_RCKOnRespCancel(void* AppID, void* AFuncID, void* AConnID)
{
   TRCAppObj* objApp = TRCKObjs::_obj()->IncRefAppObj(AppID);
   if (objApp != NULL)
   {
      objApp->DoRespCancel(AFuncID, AConnID);
      TRCKObjs::_DecRefAppObj(objApp);
   }
}

// 应用的 OnRespConfirm 回调事件
void __stdcall TRCAppObj::_RCKOnRespConfirm(void* AppID, void* AFuncID, void* AConnID)
{
   TRCAppObj* objApp = TRCKObjs::_obj()->IncRefAppObj(AppID);
   if (objApp != NULL)
   {
      objApp->DoRespConfirm(AFuncID, AConnID);
      TRCKObjs::_DecRefAppObj(objApp);
   }
}

// ---------------- 构造函数和析构函数 ----------------
// 构造函数
TRCAppObj::TRCAppObj()
{
   // 初始化
   FData       = NULL;
   FAppID      = NULL;
   FObjTimes   = 1;

   // 创建对象
   FLock       = new TKYCritSect;
   FFuncList   = new TObjList(false, false);

   // 执行初始化事件
   DoInitEvent();
}

// 析构函数
TRCAppObj::~TRCAppObj()
{
   // 判断是否非空
   if (FAppID != NULL)
   {
      // 关闭
      Close();

      // 执行清除函数列表
      DoClearFuncObjs();

      // 释放应用对象
      RCKAppFree(FAppID);
   }

   // 释放对象
   FreeAndNil(FLock);
   FreeAndNil(FFuncList);
}

// ---------------- 私有函数 ----------------
// 执行初始化事件
void TRCAppObj::DoInitEvent()
{
   OnFuncFree.Method       = NULL;
   OnFuncFree.Object       = NULL;

   FOnConnLogin.Method     = NULL;
   FOnConnLogin.Object     = NULL;
   FOnConnLogout.Method    = NULL;
   FOnConnLogout.Object    = NULL;

   FOnExecResp.Method      = NULL;
   FOnExecResp.Object      = NULL;
   FOnRespCancel.Method    = NULL;
   FOnRespCancel.Object    = NULL;
   FOnRespConfirm.Method   = NULL;
   FOnRespConfirm.Object   = NULL;
}

// 执行清除函数列表
void TRCAppObj::DoClearFuncObjs()
{
   // 初始化
   TKYList  objIDs(false);
   TKYList  objObjs(false);
   bool     boolNext = false;

   // 拷贝并清除
   Lock();
   if (FFuncList->Count() > 0)
      try
      {
         // 设置容量
         objIDs.ChangeCapacity(FFuncList->Count());
         objObjs.ChangeCapacity(FFuncList->Count());

         // 循环拷贝
         void* pNode = FFuncList->Next(NULL);
         while (pNode != NULL)
         {
            objIDs.Add(FFuncList->Value(pNode));
            objObjs.Add(FFuncList->Key(pNode));
            pNode = FFuncList->Next(pNode);
         }

         // 清除
         FFuncList->Clear();
         boolNext = true;
      }
      catch (...) {}
   Unlock();

   // 判断是否继续
   if (boolNext)
   {
      // 设置 OnDeletion 事件方法
      objIDs.OnDeletion.Object   = this;
      objIDs.OnDeletion.Method   = (TKYList::TDoDeletion)&TRCAppObj::DoIDDeletion;
      objObjs.OnDeletion.Object  = this;
      objObjs.OnDeletion.Method  = (TKYList::TDoDeletion)&TRCAppObj::DoObjDeletion;

      // 清除
      objIDs.Clear();
      objObjs.Clear();
   }
}

// 激发 OnConnLogin 事件
void TRCAppObj::DoConnLogin(void* AConnID, bool& AIsRefused)
{
   try
   {
      AIsRefused = true;
      ((TObject*)FOnConnLogin.Object->*FOnConnLogin.Method)(this, AConnID, AIsRefused);
   }
   catch (...) {}
}

// 激发 OnConnLogout 事件
void TRCAppObj::DoConnLogout(void* AConnID)
{
   try
   {
      ((TObject*)FOnConnLogout.Object->*FOnConnLogout.Method)(this, AConnID);
   }
   catch (...) {}
}

// 激发 OnExecResp 事件
void TRCAppObj::DoExecResp(void* AFuncID, void* AConnID)
{
   try
   {
      ((TObject*)FOnExecResp.Object->*FOnExecResp.Method)(this, AFuncID, AConnID);
   }
   catch (...) {}
}

// 激发 OnRespCancel 事件
void TRCAppObj::DoRespCancel(void* AFuncID, void* AConnID)
{
   try
   {
      ((TObject*)FOnRespCancel.Object->*FOnRespCancel.Method)(this, AFuncID, AConnID);
   }
   catch (...) {}
}

// 激发 OnRespConfirm 事件
void TRCAppObj::DoRespConfirm(void* AFuncID, void* AConnID)
{
   try
   {
      ((TObject*)FOnRespConfirm.Object->*FOnRespConfirm.Method)(this, AFuncID, AConnID);
   }
   catch (...) {}
}

// 列表的 OnDeletion 事件方法
void TRCAppObj::DoIDDeletion(void* AFuncID)
{
   // 从全局列表中删除
   if (TRCKObjs::_obj()->DeleteFuncID(AFuncID))
      RCKFuncFree(AFuncID);
}

// 列表的 OnDeletion 事件方法
void TRCAppObj::DoObjDeletion(TRCFuncObj* AFuncObj)
{
   // 激发 OnFuncFree 事件
   if (OnFuncFree.Method != NULL)
      try
      {
         ((TObject*)OnFuncFree.Object->*OnFuncFree.Method)(this, AFuncObj);
      }
      catch (...) {}

   // 释放
   InterlockedExchangePointer((Pointer*)&AFuncObj->FAppObj, NULL);
   delete AFuncObj;
}

// ---------------- 公有函数 ----------------
// 设置 Name 属性
long TRCAppObj::SetName(const KYString& AName)
{
   // 初始化
   long result = krUnknown;

   // 操作
   Lock();
   if (FAppID != NULL)
   {
      result = RCKAppSetStr(FAppID, kaaName, (char*)AName, AName.Length());
      if (result == krSuccess)
         FName = AName;
   }
   Unlock();

   // 返回结果
   return result;
}

// 新建函数对象
TRCFuncObj* TRCAppObj::NewFuncObj(const char* AName, long ARetType,  long  ARetSize,
                                                     long ACallMode, void* ACallback)
{
   // 初始化
   TRCFuncObj* result   = NULL;
   KYString    strName  = AName;
   void*       pFuncID  = RCKFuncCreate(FAppID, ACallMode, ACallback,
                                        (char*)strName, ARetType, ARetSize);

   // 判断是否创建成功
   if (pFuncID != NULL)
   {
      // 创建对象并加入列表
      try
      {
         TRCFuncObj* objFunc  = new TRCFuncObj;
         if (objFunc != NULL)
         {
            Lock();
            try
            {
               if (FFuncList->Add(objFunc, pFuncID) != NULL)
               {
                  objFunc->FName    = strName;
                  objFunc->FFuncID  = pFuncID;
                  objFunc->FAppObj  = this;
                  result            = objFunc;

                  // 加入列表
                  TRCKObjs::_obj()->AddFuncID(pFuncID, objFunc);
               }
            }
            catch (...) {}
            Unlock();

            // 若失败则释放对象
            if (result == NULL)
               delete objFunc;
         }
      }
      catch (...) {}

      // 若失败则释放函数
      if (result == NULL)
         RCKFuncFree(pFuncID);
   }

   // 返回结果
   return result;
}

// 删除函数对象
bool TRCAppObj::DeleteFuncObj(TRCFuncObj* AFuncObj)
{
   // 初始化
   bool result = false;

   // 检查状态
   if ((FAppID != NULL) && (State() == kasDefining))
   {
      // 初始化
      void* pFuncID  = NULL;

      // 从列表中删除
      Lock();
      try
      {
         void* pNode = FFuncList->Find(AFuncObj);
         if (pNode != NULL)
         {
            pFuncID  = FFuncList->Value(pFuncID);
            result   = true;
            FFuncList->Remove(pNode);
         }
      }
      catch (...) {}
      Unlock();

      // 判断是否成功
      if (result)
      {
         DoIDDeletion(pFuncID);
         DoObjDeletion(AFuncObj);
      }
   }

   // 返回结果
   return result;
}

// 清除函数定义
void TRCAppObj::ClearFuncObjs()
{
   // 检查状态
   if ((FAppID != NULL) && (State() == kasDefining))
      DoClearFuncObjs();
}

// 设置 OnConnLogin 事件
long TRCAppObj::SetOnConnLogin(TDoConnLogin AMethod, void* AObject)
{
   // 初始化
   long result = krUnknown;

   // 操作
   Lock();
   if (FAppID != NULL)
   {
      void* pFunc = (AMethod != NULL) ? &_RCKOnConnLogin : NULL;
      result = RCKAppSetObj(FAppID, kaaOnConnLogin, pFunc);
      if (result != krSuccess)
         ;
      else if (AMethod != NULL)
      {
         FOnConnLogin.Object = AObject;
         FOnConnLogin.Method = AMethod;
      }
      else
      {
         FOnConnLogin.Method = NULL;
         FOnConnLogin.Object = NULL;
      }
   }
   Unlock();

   // 返回结果
   return result;
}

// 设置 OnConnLogout 事件
long TRCAppObj::SetOnConnLogout(TDoConnLogout AMethod, void* AObject)
{
   // 初始化
   long result = krUnknown;

   // 操作
   Lock();
   if (FAppID != NULL)
   {
      void* pFunc = (AMethod != NULL) ? &_RCKOnConnLogout : NULL;
      result = RCKAppSetObj(FAppID, kaaOnConnLogout, pFunc);
      if (result != krSuccess)
         ;
      else if (AMethod != NULL)
      {
         FOnConnLogout.Object = AObject;
         FOnConnLogout.Method = AMethod;
      }
      else
      {
         FOnConnLogout.Method = NULL;
         FOnConnLogout.Object = NULL;
      }
   }
   Unlock();

   // 返回结果
   return result;
}

// 设置 OnExecResp 事件
long TRCAppObj::SetOnExecResp(TDoRespEvent AMethod, void* AObject)
{
   // 初始化
   long result = krUnknown;

   // 操作
   Lock();
   if (FAppID != NULL)
   {
      void* pFunc = (AMethod != NULL) ? &_RCKOnExecResp : NULL;
      result = RCKAppSetObj(FAppID, kaaOnExecResp, pFunc);
      if (result != krSuccess)
         ;
      else if (AMethod != NULL)
      {
         FOnExecResp.Object = AObject;
         FOnExecResp.Method = AMethod;
      }
      else
      {
         FOnExecResp.Method = NULL;
         FOnExecResp.Object = NULL;
      }
   }
   Unlock();

   // 返回结果
   return result;
}

// 设置 OnRespCancel 事件
long TRCAppObj::SetOnRespCancel(TDoRespEvent AMethod, void* AObject)
{
   // 初始化
   long result = krUnknown;

   // 操作
   Lock();
   if (FAppID != NULL)
   {
      void* pFunc = (AMethod != NULL) ? &_RCKOnRespCancel : NULL;
      result = RCKAppSetObj(FAppID, kaaOnRespCancel, pFunc);
      if (result != krSuccess)
         ;
      else if (AMethod != NULL)
      {
         FOnRespCancel.Object = AObject;
         FOnRespCancel.Method = AMethod;
      }
      else
      {
         FOnRespCancel.Method = NULL;
         FOnRespCancel.Object = NULL;
      }
   }
   Unlock();

   // 返回结果
   return result;
}

// 设置 OnRespConfirm 事件
long TRCAppObj::SetOnRespConfirm(TDoRespEvent AMethod, void* AObject)
{
   // 初始化
   long result = krUnknown;

   // 操作
   Lock();
   if (FAppID != NULL)
   {
      void* pFunc = (AMethod != NULL) ? &_RCKOnRespConfirm : NULL;
      result = RCKAppSetObj(FAppID, kaaOnRespConfirm, pFunc);
      if (result != krSuccess)
         ;
      else if (AMethod != NULL)
      {
         FOnRespConfirm.Object = AObject;
         FOnRespConfirm.Method = AMethod;
      }
      else
      {
         FOnRespConfirm.Method = NULL;
         FOnRespConfirm.Object = NULL;
      }
   }
   Unlock();

   // 返回结果
   return result;
}

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/* TRCFuncObj - RCK 函数类 */

// ---------------- 构造函数和析构函数 ----------------
// 构造函数
TRCFuncObj::TRCFuncObj()
{
   FData       = NULL;
   FFuncID     = NULL;
   FAppObj     = NULL;
}

// 析构函数
TRCFuncObj::~TRCFuncObj()
{
   TRCAppObj* objApp = (TRCAppObj*)InterlockedExchangePointer((Pointer*)&FAppObj, NULL);
   if (objApp != NULL)
      objApp->DeleteFuncObj(this);
}

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/* TRCConnObj - RCK 连接类 */

// ---------------- 静态函数 ----------------
// 连接的 OnConnect 回调事件
void __stdcall TRCConnObj::_RCKOnConnect(void* AConnID)
{
   TRCConnObj* objConn = TRCKObjs::_obj()->IncRefConnObj(AConnID);
   if (objConn != NULL)
   {
      objConn->DoConnect();
      TRCKObjs::_DecRefConnObj(objConn);
   }
}

// 连接的 OnDisconnect 回调事件
void __stdcall TRCConnObj::_RCKOnDisconnect(void* AConnID)
{
   TRCConnObj* objConn = TRCKObjs::_obj()->IncRefConnObj(AConnID);
   if (objConn != NULL)
   {
      objConn->DoDisconnect();
      TRCKObjs::_DecRefConnObj(objConn);
   }
}

// 连接的 OnLogin 回调事件
void __stdcall TRCConnObj::_RCKOnLogin(void* AConnID)
{
   TRCConnObj* objConn = TRCKObjs::_obj()->IncRefConnObj(AConnID);
   if (objConn != NULL)
   {
      objConn->DoLogin();
      TRCKObjs::_DecRefConnObj(objConn);
   }
}

// 连接的 OnLogout 回调事件
void __stdcall TRCConnObj::_RCKOnLogout(void* AConnID)
{
   TRCConnObj* objConn = TRCKObjs::_obj()->IncRefConnObj(AConnID);
   if (objConn != NULL)
   {
      objConn->DoLogout();
      TRCKObjs::_DecRefConnObj(objConn);
   }
}

// 连接的 OnCmdReturn 回调事件
void __stdcall TRCConnObj::_RCKOnCmdReturn(void* AConnID, void* ACmdID, long AResult)
{
   TRCConnObj* objConn = TRCKObjs::_obj()->IncRefConnObj(AConnID);
   if (objConn != NULL)
   {
      objConn->DoCmdReturn(ACmdID, AResult);
      TRCKObjs::_DecRefConnObj(objConn);
   }
}

// 连接的 OnRecvData 回调事件
void __stdcall TRCConnObj::_RCKOnRecvData(void* AConnID, const void* AData, long ASize)
{
   TRCConnObj* objConn = TRCKObjs::_obj()->IncRefConnObj(AConnID);
   if (objConn != NULL)
   {
      objConn->DoRecvData(AData, ASize);
      TRCKObjs::_DecRefConnObj(objConn);
   }
}

// ---------------- 构造函数和析构函数 ----------------
// 构造函数
TRCConnObj::TRCConnObj(void* AConnID, bool ANeedFree)
{
   // 初始化
   FData          = NULL;
   FConnID        = AConnID;
   FObjTimes      = 1;
   FCanEvent      = false;
   FNeedFree      = ANeedFree && (AConnID != NULL);

   // 执行初始化事件
   DoInitEvent();
}

// 析构函数
TRCConnObj::~TRCConnObj()
{
   // 判断是否需要释放连接
   if (FNeedFree && (FConnID != NULL))
      RCKConnFree(FConnID);
}

// ---------------- 私有函数 ----------------
// 执行初始化事件
void TRCConnObj::DoInitEvent()
{
   FOnConnect.Method    = NULL;
   FOnConnect.Object    = NULL;
   FOnDisconnect.Method = NULL;
   FOnDisconnect.Object = NULL;

   FOnLogin.Method      = NULL;
   FOnLogin.Object      = NULL;
   FOnLogout.Method     = NULL;
   FOnLogout.Object     = NULL;

   FOnCmdReturn.Method  = NULL;
   FOnCmdReturn.Object  = NULL;
   FOnRecvData.Method   = NULL;
   FOnRecvData.Object   = NULL;
}

// 激发 OnConnect 事件
void TRCConnObj::DoConnect()
{
   try
   {
      ((TObject*)FOnConnect.Object->*FOnConnect.Method)(this);
   }
   catch (...) {}
}

// 激发 OnDisconnect 事件
void TRCConnObj::DoDisconnect()
{
   try
   {
      ((TObject*)FOnDisconnect.Object->*FOnDisconnect.Method)(this);
   }
   catch (...) {}
}

// 激发 OnLogin 事件
void TRCConnObj::DoLogin()
{
   try
   {
      ((TObject*)FOnLogin.Object->*FOnLogin.Method)(this);
   }
   catch (...) {}
}

// 激发 OnLogout 事件
void TRCConnObj::DoLogout()
{
   try
   {
      ((TObject*)FOnLogout.Object->*FOnLogout.Method)(this);
   }
   catch (...) {}
}

// 激发 OnCmdReturn 事件
void TRCConnObj::DoCmdReturn(void* ACmdID, long AResult)
{
   try
   {
      ((TObject*)FOnCmdReturn.Object->*FOnCmdReturn.Method)(this, ACmdID, AResult);
   }
   catch (...) {}
}

// 激发 OnRecvData 事件
void TRCConnObj::DoRecvData(const void* AData, long ASize)
{
   try
   {
      ((TObject*)FOnRecvData.Object->*FOnRecvData.Method)(this, AData, ASize);
   }
   catch (...) {}
}

// ---------------- 公有函数 ----------------
// 设置 OnConnect 事件
long TRCConnObj::SetOnConnect(TDoNotify AMethod, void* AObject)
{
   // 初始化
   long result = krUnknown;

   // 检查参数
   if (FConnID == NULL)
      ;
   else if (!FCanEvent)
      result = krFailure;
   else
   {
      void* pFunc = (AMethod != NULL) ? &_RCKOnConnect : NULL;
      result = RCKConnSetObj(FConnID, kcaOnConnect, pFunc);
      if (result != krSuccess)
         ;
      else if (AMethod != NULL)
      {
         FOnConnect.Object = AObject;
         FOnConnect.Method = AMethod;
      }
      else
      {
         FOnConnect.Method = NULL;
         FOnConnect.Object = NULL;
      }
   }

   // 返回结果
   return result;
}

// 设置 OnDisconnect 事件
long TRCConnObj::SetOnDisconnect(TDoNotify AMethod, void* AObject)
{
   // 初始化
   long result = krUnknown;

   // 检查参数
   if (FConnID == NULL)
      ;
   else if (!FCanEvent)
      result = krFailure;
   else
   {
      void* pFunc = (AMethod != NULL) ? &_RCKOnDisconnect : NULL;
      result = RCKConnSetObj(FConnID, kcaOnDisconnect, pFunc);
      if (result != krSuccess)
         ;
      else if (AMethod != NULL)
      {
         FOnDisconnect.Object = AObject;
         FOnDisconnect.Method = AMethod;
      }
      else
      {
         FOnDisconnect.Method = NULL;
         FOnDisconnect.Object = NULL;
      }
   }

   // 返回结果
   return result;
}

// 设置 OnLogin 事件
long TRCConnObj::SetOnLogin(TDoNotify AMethod, void* AObject)
{
   // 初始化
   long result = krUnknown;

   // 检查参数
   if (FConnID == NULL)
      ;
   else if (!FCanEvent)
      result = krFailure;
   else
   {
      void* pFunc = (AMethod != NULL) ? &_RCKOnLogin : NULL;
      result = RCKConnSetObj(FConnID, kcaOnLogin, pFunc);
      if (result != krSuccess)
         ;
      else if (AMethod != NULL)
      {
         FOnLogin.Object = AObject;
         FOnLogin.Method = AMethod;
      }
      else
      {
         FOnLogin.Method = NULL;
         FOnLogin.Object = NULL;
      }
   }

   // 返回结果
   return result;
}

// 设置 OnLogout 事件
long TRCConnObj::SetOnLogout(TDoNotify AMethod, void* AObject)
{
   // 初始化
   long result = krUnknown;

   // 检查参数
   if (FConnID == NULL)
      ;
   else if (!FCanEvent)
      result = krFailure;
   else
   {
      void* pFunc = (AMethod != NULL) ? &_RCKOnLogout : NULL;
      result = RCKConnSetObj(FConnID, kcaOnLogout, pFunc);
      if (result != krSuccess)
         ;
      else if (AMethod != NULL)
      {
         FOnLogout.Object = AObject;
         FOnLogout.Method = AMethod;
      }
      else
      {
         FOnLogout.Method = NULL;
         FOnLogout.Object = NULL;
      }
   }

   // 返回结果
   return result;
}

// 设置 OnCmdReturn 事件
long TRCConnObj::SetOnCmdReturn(TDoCmdReturn AMethod, void* AObject)
{
   // 初始化
   long result = krUnknown;

   // 检查参数
   if (FConnID == NULL)
      ;
   else if (!FCanEvent)
      result = krFailure;
   else
   {
      void* pFunc = (AMethod != NULL) ? &_RCKOnCmdReturn : NULL;
      result = RCKConnSetObj(FConnID, kcaOnCmdReturn, pFunc);
      if (result != krSuccess)
         ;
      else if (AMethod != NULL)
      {
         FOnCmdReturn.Object = AObject;
         FOnCmdReturn.Method = AMethod;
      }
      else
      {
         FOnCmdReturn.Method = NULL;
         FOnCmdReturn.Object = NULL;
      }
   }

   // 返回结果
   return result;
}

// 设置 OnRecvData 事件
long TRCConnObj::SetOnRecvData(TDoRecvData AMethod, void* AObject)
{
   // 初始化
   long result = krUnknown;

   // 检查参数
   if (FConnID == NULL)
      ;
   else if (!FCanEvent)
      result = krFailure;
   else
   {
      void* pFunc = (AMethod != NULL) ? &_RCKOnRecvData : NULL;
      result = RCKConnSetObj(FConnID, kcaOnRecvData, pFunc);
      if (result != krSuccess)
         ;
      else if (AMethod != NULL)
      {
         FOnRecvData.Object = AObject;
         FOnRecvData.Method = AMethod;
      }
      else
      {
         FOnRecvData.Method = NULL;
         FOnRecvData.Object = NULL;
      }
   }

   // 返回结果
   return result;
}

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/* TRCCmdObj - RCK 命令类 */

// ---------------- 构造函数和析构函数 ----------------
// 构造函数
TRCCmdObj::TRCCmdObj()
{
   FData    = NULL;
   FCmdID   = RCKCmdCreate();

   // 设置关联对象
   if (FCmdID != NULL)
      RCKCmdSetObj(FCmdID, kmaData, this);
}

// 析构函数
TRCCmdObj::~TRCCmdObj()
{
   if (FCmdID != NULL)
   {
      // 清除关联
      RCKCmdSetObj(FCmdID, kmaData, NULL);

      // 释放对象
      RCKCmdFree(FCmdID);
   }
}

// ---------------- 公有函数 ----------------
// 取连接对象
TRCConnObj* TRCCmdObj::ConnObj() const
{
   // 初始化
   TRCConnObj* result   = NULL;
   void*       pConnID  = RCKCmdGetObj(FCmdID, kmaConnObj, NULL);

   // 判断是否非空
   if (pConnID != NULL)
   {
      result = TRCKObjs::_obj()->IncRefConnObj(pConnID);
      if (result != NULL)
         TRCKObjs::_DecRefConnObj(result);
   }

   // 返回结果
   return result;
}

// 执行带参数的命令
long TRCCmdObj::ExecByParams(Longword ATimeout, ...) const
{
   // 取参数个数
   long intCount = ParamCount();
   if (intCount > 0)
   {
      // 初始化
      const void* pUnknow;

      // 清除参数
      RCKCmdParamClear(FCmdID);

      // 可变参数初始化
      va_list  arrArgs;
      va_start(arrArgs, ATimeout);

      // 加入参数
      for (long intNo = 0; intNo < intCount; intNo++)
         switch (ParamType(intNo))
         {
         case kdtString:
            RCKCmdParamByStr(FCmdID, intNo, va_arg(arrArgs, const char*), -1);
            break;

         case kdtInteger:
            RCKCmdParamByInt(FCmdID, intNo, va_arg(arrArgs, int));
            break;

         case kdtBoolean:
            RCKCmdParamByBool(FCmdID, intNo, va_arg(arrArgs, bool));
            break;

         case kdtDouble:
            RCKCmdParamByFloat(FCmdID, intNo, va_arg(arrArgs, double));
            break;

         case kdtStruct:
            RCKCmdParamByStruct(FCmdID, intNo, va_arg(arrArgs, void*));
            break;

         case kdtByte:
            RCKCmdParamByInt(FCmdID, intNo, va_arg(arrArgs, Byte));
            break;

         case kdtWord:
            RCKCmdParamByInt(FCmdID, intNo, va_arg(arrArgs, Word));
            break;

         case kdtSmallint:
            RCKCmdParamByInt(FCmdID, intNo, va_arg(arrArgs, Smallint));
            break;

         case kdtInt64:
            RCKCmdParamByInt64(FCmdID, intNo, va_arg(arrArgs, __int64));
            break;

         case kdtDateTime:
            RCKCmdParamByDate(FCmdID, intNo, va_arg(arrArgs, double));
            break;

         case kdtCurrency:
            RCKCmdParamByFloat(FCmdID, intNo, va_arg(arrArgs, double));
            break;

         default:
            pUnknow = va_arg(arrArgs, const void*);
         }

      // 可变参数释放
      va_end(arrArgs);
   }

   // 执行
   return RCKCmdExecute(FCmdID, ATimeout);
}

// 取返回值的字符串值
KYString TRCCmdObj::RetAsStr() const
{
   // 初始化
   KYString result;
   long     intSize;
   char*    pRet;

   // 取返回值
   pRet  = RCKCmdRetStr(FCmdID, &intSize);
   if (pRet != NULL)
      result.SetString(pRet, intSize);

   // 返回结果
   return result;
}

// 取返回字段的字符串值
KYString TRCCmdObj::FieldAsStr(long AIndex) const
{
   // 初始化
   KYString result;
   long     intSize;
   char*    pRet;

   // 取返回字段值
   pRet  = RCKCmdFieldStr(FCmdID, AIndex, &intSize);
   if (pRet != NULL)
      result.SetString(pRet, intSize);

   // 返回结果
   return result;
}

// 取返回字段的字符串值
KYString TRCCmdObj::FieldAsStr(const char* AName) const
{
   // 初始化
   KYString result;
   long     intSize;
   char*    pRet;

   // 取返回字段值
   pRet  = RCKCmdFieldStr_(FCmdID, AName, &intSize);
   if (pRet != NULL)
      result.SetString(pRet, intSize);

   // 返回结果
   return result;
}

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/* TRCResp - RCK 应答类 */

// ---------------- 静态函数 ----------------
// 取返回值的字符串值
KYString TRCResp::RetAsStr()
{
   // 初始化
   KYString result;
   long     intSize;
   char*    pRet;

   // 取返回值
   pRet  = RCKRespRetStr(&intSize);
   if (pRet != NULL)
      result.SetString(pRet, intSize);

   // 返回结果
   return result;
}

// 取返回字段的字符串值
KYString TRCResp::FieldAsStr(long AIndex)
{
   // 初始化
   KYString result;
   long     intSize;
   char*    pRet;

   // 取返回字段值
   pRet  = RCKRespFieldStr(AIndex, &intSize);
   if (pRet != NULL)
      result.SetString(pRet, intSize);

   // 返回结果
   return result;
}

// 取返回字段的字符串值
KYString TRCResp::FieldAsStr(const char* AName)
{
   // 初始化
   KYString result;
   long     intSize;
   char*    pRet;

   // 取返回字段值
   pRet  = RCKRespFieldStr_(AName, &intSize);
   if (pRet != NULL)
      result.SetString(pRet, intSize);

   // 返回结果
   return result;
}

// 取参数的字符串值
KYString TRCResp::ParamAsStr(long AIndex)
{
   // 初始化
   KYString result;
   long     intSize;
   char*    pRet;

   // 取参数值
   pRet  = RCKRespParamStr(AIndex, &intSize);
   if (pRet != NULL)
      result.SetString(pRet, intSize);

   // 返回结果
   return result;
}

// 取参数的字符串值
KYString TRCResp::ParamAsStr(const char* AName)
{
   // 初始化
   KYString result;
   long     intSize;
   char*    pRet;

   // 取参数值
   pRet  = RCKRespParamStr_(AName, &intSize);
   if (pRet != NULL)
      result.SetString(pRet, intSize);

   // 返回结果
   return result;
}

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/* TRCFields - RCK 字段集类 */

// ---------------- 构造函数和析构函数 ----------------
// 构造函数
TRCFields::TRCFields()
{
   FFields  = RCKFieldsCreate();
   FIsBound = (FFields != NULL);
}

TRCFields::TRCFields(void* AFields)
{
   FFields  = AFields;
   FIsBound = false;
}

// 析构函数
TRCFields::~TRCFields()
{
   if (FIsBound)
      RCKFieldsFree(FFields);
}

// ---------------- 公有函数 ----------------
// 取字段定义集字符串
KYString TRCFields::FieldDefs() const
{
   // 初始化
   KYString result;
   long     intSize;
   char*    pRet;

   // 取字段值
   pRet  = (char*)RCKFieldDefsOutput(FFields, &intSize);
   if (pRet != NULL)
      result.SetString(pRet, intSize);

   // 返回结果
   return result;
}

// 取字段集字符串
KYString TRCFields::DataSet() const
{
   // 初始化
   KYString result;
   long     intSize;
   char*    pRet;

   // 取字段值
   pRet  = (char*)RCKFieldsOutput(FFields, &intSize);
   if (pRet != NULL)
      result.SetString(pRet, intSize);

   // 返回结果
   return result;
}

// 取字段的字符串值
KYString TRCFields::AsStr(long AIndex) const
{
   // 初始化
   KYString result;
   long     intSize;
   char*    pRet;

   // 取字段值
   pRet  = RCKFieldAsStr(FFields, AIndex, &intSize);
   if (pRet != NULL)
      result.SetString(pRet, intSize);

   // 返回结果
   return result;
}

// 取字段的字符串值
KYString TRCFields::AsStr(const char* AName) const
{
   // 初始化
   KYString result;
   long     intSize;
   char*    pRet;

   // 取字段值
   pRet  = RCKFieldAsStr_(FFields, AName, &intSize);
   if (pRet != NULL)
      result.SetString(pRet, intSize);

   // 返回结果
   return result;
}

/* end namespace */

   }
}


远程调用内核接口的封装类(RCKObjs),布布扣,bubuko.com

远程调用内核接口的封装类(RCKObjs)

标签:rc   rck   c++源码   

原文地址:http://blog.csdn.net/kyee/article/details/37561571

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!