test02

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

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月6日 下午6:40
下一篇 2023年2月6日 下午6:40

相关推荐