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


    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 函数事例

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

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

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

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

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

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

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

  • 相关阅读:
    1028 人口普查(JAVA)
    洛谷——P1093 [NOIP2007 普及组] 奖学金
    Postgresql在linux环境下以源码方式安装
    2024年的后端和Web开发趋势
    C语言学习笔记(五)
    论文阅读--基于编码器-解码器的卷积神经网络与多尺度感知模块用于人群计数
    ES6 从入门到精通 # 08:扩展的对象的功能
    WebRTC之丢包重传协议
    基于Java微信小程序民宿短租系统设计和实现(源码+LW+调试文档+讲解等)
    mysql驱动包引起的告警问题using SSL the verifyServerCertificate property is set to ‘false‘
  • 原文地址:https://blog.csdn.net/lxbin2003/article/details/126761270