HSQOBJECTpo=0;//用于保存 callback 函数(脚本函数对象)
//调用脚本回调函数(并释放)
intdoCallback(HSQUIRRELVM v)
{
if(po!=0) {
//如果closure已经注册,那么将其压入堆栈
sq_pushobject(v,po);
//压入roottable作为closure执行“上下文”
sq_pushroottable(v);
//发起调用(SQFalse,SQFalse表示不返回值,且不引发脚本异常)
if(SQ_FAILED(sq_call(v,1, SQFalse, SQFalse))) {
printf("回调函数调用失败\n");
}
//无论closure调用是否成功,closure本身仍然在栈上,因此弹出
sq_poptop(v);
//减少closure的引用计数(解除C++对该closure的引用)
sq_release(v, po);
delete po;
po=0;
}
return0;
}
//注册回调函数
intsetCallback(HSQUIRRELVM v)
{
//printf("C::setCallback() top:%d toptype: %d\n", sq_gettop(v), sq_gettype(v, 2));
po=newHSQOBJECT;
//setCallback被调用时,第一参数是roottable,第二参数是一个closure回调(这里简单起见不做任何检查)
if(SQ_SUCCEEDED(sq_getstackobj(v,2, po)))
{
//增加po的引用计数,使其不会由于没有脚本对po的引用而被回收
sq_addref(v, po);
}
return0;
}
原文链接: https://www.cnblogs.com/sonic620/archive/2010/02/06/1665090.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/8024
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!