PB的扩展DLL开发(超级篇)(八)

22 篇文章 12 订阅
7 篇文章 13 订阅

PB的扩展DLL开发(超级篇)(八)

(PB史上第一次开放的开发技术)

如何调用对象的现有函数和事件

由之前的篇章,我们知道一个system library 函数,它是2个参数,即:(POB_THIS obThis,int nArgs),如果是这样的一个函数,我们怎么调用它呢?接下来,我举2个例子,一个全局函数例子,另一个对象成员函数例子。

我们分析过 OB_THIS这个结构,PVOID evaled_arglist 成员指向的是一个参数列表,比如 OB_DATA[] 数组, UINT curr_arg_pos 成员指向当前取第几个参数,函数调用时把它初始化为0,如果有返回值,POT_EVAL_NODE called_return_value 指向一个OB_DATA,用于接收返回值。OB_INST_ID curr_obinst设置为当前被调用对象的实例指针。 原理就是这么个原理,除此外,还有若干环境需要我们调用前保存,调用后恢复,使用起来相当麻烦。这里,我们知道原理就行了。我们介绍另外的调用方法。要用到RT_CALL_INFO 结构和rtRoutineExecrtReturnValGet函数。

一、调用全局MessageBox 函数事例

全局函数,它不依赖于对象实例而存在。

int nArgCount = 2; //2个参数
OB_DATA args[2];
ob_set_data_ptr(&args[0],ob_dup_string(obThis,_T(“this is title”))); //标题
ob_set_data_ptr(&args[1],ob_dup_string(obThis,_T(“this is message text”))); //显示内容
 
OB_GROUP_HNDL sysGroupHndl = 0;
OB_CLASS_HNDL hndl = ob_global_reference(obThis, (LPTSTR)_T(“MessageBox”), &sysGroupHndl); //获取类句柄
if (sysGroupHndl == 0xffff)
		hndl = ob_global_reference(obThis, (LPTSTR)_T("systemfunctions"), &sysGroupHndl);
//准备调用结构
RT_CALL_INFO ri = { 0 };
ri.bDontTerminateRuntime = TRUE;
ri.enCallType = RT_CLASS_CALL;
ri.rtClassInfo.obClassHndl.class_id = hndl.class_id;
ri.rtClassInfo.obClassHndl.group_hndl = hndl.group_hndl;
//开始调用
RT_EXEC_STATUS status = RT_EXEC_FAILURE;
rtRoutineLevelIncrement(obThis);
OB_VTABLE_ID vTabID = 0;
rtRoutineSearch(m_obThis, ri, (LPTSTR) (“MessageBox”), lpArgs, nArgCount, OB_FUNCTION, &vTabID); //根据参数类型和参数个数,搜索匹配的函数
status = rtRoutineExec(obThis, ri, lpArgs, nArgCount, vTabID, OB_FUNCTION, TRUE); //调用函数
rtRoutineLevelDecrement(obThis);
POB_DATA returnData = rtReturnValGet(obThis); //取得返回值

至此,全局函数调用完成。

二、调用对象实例函数事例,datawindow.show()函数

OB_INST_ID obInstID = ….; 这里是DW的实例指针
int nArgCount = 0; //0个参数
OB_DATA args[2];
//如果有参数,请参考全局函数调用方式设置参数
OB_CLASS_HNDL hndl = ob_get_obinst_class_hndl(obThis, obInstDW);
//准备调用结构
RT_CALL_INFO ri = { 0 };
ri.bDontTerminateRuntime = TRUE;
ri.enCallType = RT_INST_CALL;
ri.rtClassInfo.obInst = obInstDW;
ri.rtClassInfo.obClassHndl.class_id = hndl.class_id;
ri.rtClassInfo.obClassHndl.group_hndl = hndl.group_hndl;
//开始调用
RT_EXEC_STATUS status = RT_EXEC_FAILURE;
rtRoutineLevelIncrement(obThis);
OB_VTABLE_ID vTabID = 0;
rtRoutineSearch(m_obThis, ri, (LPTSTR) (“show”), lpArgs, nArgCount, OB_FUNCTION, &vTabID); //根据参数类型和参数个数,搜索匹配的函数
status = rtRoutineExec(obThis, ri, lpArgs, nArgCount, vTabID, OB_FUNCTION, TRUE); //调用函数
rtRoutineLevelDecrement(obThis);
POB_DATA returnData = rtReturnValGet(obThis); //取得返回值

至此,对象实例函数调用完成。

如果你对system library相关开发方式感兴趣,可到QQ群624409252共享里大自在的专用目录下下载DEMO。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值