64,685
社区成员
发帖
与我相关
我的任务
分享
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* 常量及类型定义 */
// 参数类型
enum TKYParamType {ptPointer, // Pointer
ptByte, // Byte
ptWord, // Word
ptLongword, // Longword
ptInteger, // Integer
ptShortint, // Shortint
ptSmallint, // Smallint
ptLongint, // Longint
ptInt64, // Int64
ptBoolean, // Boolean
ptSingle, // Single
ptDouble, // Double
ptCurrency, // Currency: __int64 类型存储
ptStruct}; // Struct: sizeof(Struct) -> RecSize
// 参数项
#pragma pack(push, 1)
typedef struct
{
char Type; // 参数类型 (TKYParamType)
bool IsRef; // 是否引用传递(若为true则IsReal,IsAddr忽略)
bool IsReal; // 是否为浮点数
bool IsAddr; // ptStruct 尺寸不为: 1, 2, 4, 8
int RecSize; // ptStruct 类型尺寸
union
{
__int64 VInt64; // __int64 类型值
double VDouble; // double 类型值
float VSingle; // float 类型值
void* VPointer; // void* 类型值
char Buffer[8]; // 值的缓冲区
};
} TKYParamItem, *PKYParamItem;
#pragma pack(pop)
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* 调用函数 */
// 注:
// 1. 若函数无返回值, 则 AResult 传为 NULL
// 2. AFunc 函数指针不允许为空
// 3. 若 ACount != 0 时, AParams 不允许为空
// 调用函数指针
bool CallFunc(void* AFunc, TKYParamItem* AParams,
TKYParamItem* AResult, unsigned ACount);
// 执行带参数的命令
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);
}