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


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

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

    对象实例化与销毁

    假设有PB代码是这样:

    uo_json js

    js = create uo_json

    DLL里实现同样的功能代码是:

    OB_INST_ID obInstID = NULL;

    if (rt_create_obinst(obThis, (LPTSTR)_T(“uo_json”), &obInstID) == 1)

    {

        //实例化成功

    }

    如果要把实例返回给PB

    OB_DATA obReturn = {0};

    OB_CLASS_HNDL hndl = ob_get_obinst_class_hndl(obThis, obInstID);

    OB_CLASS_ID classID =  hndl.class_id ; //得到其类型

    ob_set_data_obinst(&obReturn, obInstID, classID, OB_INSTVAR_FIELD);

    if(obInstID == NULL)

      ob_set_info_nullval(obReturn .info, TRUE); //如果创建失败,是空值,要把NULL标志打上,这样在PB里用 isnull() isvalid()  判断时会是 false

    ot_set_return_val(obThis, &obReturn); //返回对象实例

    其他可以对象实例化的函数还有:

    ob_create_obinst

    ot_create_obinst_with_name

    ot_create_obinst_at_lval

    ob_create_object

    ob_create_object_using

    有ot_开头的和ob_开头的函数,ot_开头的应该是runtime 类函数,比ob_开头要高级一些,建议尽量使用 ot_开头的函数。

    一个对象实例后,返回给PB环境,可以显式的  destroy js,如果不写destroy代码,PB也会自动 销毁它。

    DLL里可以自己销毁

    ob_destroy_obinst(obThis,obInstID);

    要注意, PB代码里并不知道你DLL里已销毁,会继续销毁,造成程序崩溃。所以,通常不需要调用ob_destroy_obinst这个销毁函数。

    我在思考:这个销毁导致崩溃,应该跟引用计数有关系。只有当它的引用计数为0时,才会真正销毁。有个函数 rtDataCopy它的最后一个参数表示是否增加引用计数。如果是传入参数,我们可以用 rtDataCopy 复制一份自己用,用完可以ob_destroy_obinst,不会崩溃。可惜,我没找到在哪可以直接添加这个引用计数。有知道的请告诉我一下,我好把这个坑填一下。(*(DWORD*)((DWORD)obInstID + 24)) ++; 倒是可以实现计数增1,但总不敢用,还是有SDK 函数用起来更放心。

    以上说的是不可视对象和实例化和销毁。至于可视化对象,还是在PB设计环境里用鼠标拖放吧,DLL里实现起来非常复杂,我也没掌握好,这里就不说了。

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

    B的扩展DLL开发(超级篇)(七)

  • 相关阅读:
    第二部分:DDD 设计中的基本元素
    ORACLE的utl_raw函数在不同字符集的数据库中的用法
    【牛客-SQL进阶挑战】增删改操作 (插入记录SQL110-112 更新记录SQL113-114 删除记录SQL115-117)
    linux sh脚本各种数值进制转换(比如10进制转16)若干例子
    大数据数仓建模基础理论【维度表、事实表、数仓分层及示例】
    【数据结构与算法】DFA算法-关键词匹配-java案例实现
    .net core添加SQL日志输出
    C语言指针笔试题讲解
    dpdk环境搭建和工作原理
    ESP32IDF出现Syntax Warning in cmake code at column 47报错
  • 原文地址:https://blog.csdn.net/lxbin2003/article/details/125556751