BastEt 阅读(1375) 评论(9)
Squirrel是个脚本,再具体的就不说了,直接看代码。
#pragma pack(push,1)
namespace DZH
{
struct DayData
{
unsigned long date;//date的格式:20070423
unsigned long open;//开盘价
unsigned long high;//最高价
unsigned long low;//最低价
unsigned long close;//收盘价
unsigned long moneysum;//成交金额
unsigned long turnover;//成交数量
char unused[12];//保留
};
}
#pragma pack(pop)

DZH::DayData curData;

SQInteger ScriptGetOpen(HSQUIRRELVM v)
{
StackHandler sa(v);
int paramCount = sa.GetParamCount();
//假设只有一个参数,也确实只有一个参数,我们现在先没有参数传递进去吧。//sa.GetInt(i)),sa.GetString(i)来获得参数
return sa.Return((INT)curData.open);
}

SQInteger ScriptGetClose(HSQUIRRELVM v)
{
StackHandler sa(v);
int paramCount = sa.GetParamCount();
//假设只有一个参数,也确实只有一个参数,我们现在先没有参数传递进去吧。//sa.GetInt(i)),sa.GetString(i)来获得参数
return sa.Return((INT)curData.close);
}

这里定义了两个在脚本里可以调用的函数
初始化一下
SquirrelVM::Init();
SquirrelVM::CreateFunctionGlobal(ScriptGetOpen,"GetOpen",_T(""));
SquirrelVM::CreateFunctionGlobal(ScriptGetClose,"GetClose",_T("")); // String var name.
SquirrelObject scriptfunc=SquirrelVM::CompileBuffer("function ciao()\r\n{ return GetOpen()-GetClose();\r\n}");//这里用到了上面定义的函数
SquirrelVM::RunScript(scriptfunc);

使用:
SqPlus::SquirrelFunction func_formula(_T("ciao"));
int ival = func_formula();
这样就OK了,是如此的方便。

评论列表
Diviner
re: 在程序里使用Squirrel脚本互相调用。
导出C++类的方法
typedef DZH::DayData DZH_DayData;

DECLARE_INSTANCE_TYPE(DZH_DayData)
void DefineClass()
{
SqPlus::SQClassDef<DZH_DayData>(_T("DZH_DayData")).
var(&DZH::DayData::date,_T("date")).
var(&DZH::DayData::open,_T("open")).
var(&DZH::DayData::high,_T("high")).
var(&DZH::DayData::low,_T("low")).
var(&DZH::DayData::close,_T("close")).
var(&DZH::DayData::moneysum,_T("moneysum")).
var(&DZH::DayData::turnover,_T("turnover"));
}


然后执行
curRecord->AddItem(new CXTPReportRecordItemNumber(func_formula(&curItem)));
即可
Diviner
re: 在程序里使用Squirrel脚本互相调用。
SquirrelObject scriptfunc=SquirrelVM::CompileBuffer("function ciao(item)\r\n{ return item.open;\r\n}");

发表评论
切换编辑模式