PowerBuilder Native Interface(PBNI)(一)

PowerBuilder 9 开发技术 

 

PowerBuilder Native Interface(PBNI)

<摘自倍力技术小组>

 

PowerBuilder 现在于其它开发语言的支持,有了全新的突破,在以往使用 PowerBuilder 开发程时,要和 C++或是 Java 程序互通有无是有一些折衷的办 法,但是总是没有办法做到简易而且全面性的支持。现在只要透过 PowerBuilder

PBNI 以让 PowerBuilder 序呼叫 Java或是在一个 C++的程 式中引用 PowerBuilder NVO 对象函数。

 

 

 

 

 

以往的 PowerBuilder 程序只能够透过外在函数呼叫的方式来存取 C/C++的函 数,但在 PowerBuilder 9.0 之中扩增了一项强而有力的界面-「PowerBuilder Native Interface,简称 PBNI。透过 PBNI 开发方式,PowerBuilder 开发人员 不仅可以使用对象导向的方式来存取 C/C++而且还可反向地让 C/C++程序 呼叫 PowerBuilder 的对象,达到应用程序的整合。更甚者,在藉由 JNI PBNI 两者的结合,Java 应用程序也可双向地与 PowerBuilder 程序通。

 

 

 PBNI

 

 

 

在谈什么是 PBNI ,我们先来谈谈下面三个问题:

1.   开发人员有办法用 PowerBuilder 程序呼叫 C 或是 C++的程序吗?

2.   开发人员有办法用 PowerBuilder 程序呼叫一外部组件像是 Java EJB 组件、

Web Service 组件、Java Class 程序等诸如此类的组件?

3.   开发人员有办法用反过来, C 或是 C++呼叫已经使用 PowerBuilder 开发好 的程序?

 

 

上述三个问题,在过去的 PowerBuilder 其实可以做到某种程度的地步,只是都 有些问传统上使用 PowerBuilder 开发上的程序如果要呼叫 C 或是 C++ 的程序,是可以使用宣告外部函数的方式来使用一个已经撰写好的 DLL 函数, 例如:

 

 

FUNCTION ulong GetSysColor (int index) LIBRARY "USER32.DLLFUNCTION boolean sndPlaySoundA (string SoundName, uint Flags) LIBRARY "WINMM.DLL"


可是如果是下面的程序呢:

 

 

BOOL EnumWindows(WNDENUMPROC    lpEnumFunc, LPARAM

lParam);

 

 

这个可是个大问题了,因为这个 Windows DLL Function 中会用到所谓Callback

函数的技术,所谓的 Callback Function 指的是今天有 A B 两个对象,在程序中 A 对象呼叫 B 对象的 Function而在该 B Function 又会回头呼叫 A 对象的 其它 Function,这就叫「Callback」。在 PowerBuilder 呼叫 C Function 后,在这 C Function 中要回头呼叫 PowerBuilder 的函数是不可能用引用外部函数的 方式来达到这个目地的。除了 Callback Function 使用困难之外,使用外部函数也 有数据型态的限制,以及没有办法使用对象导向的方式开发等种种的困难及问 题。

 

 

再来谈谈 PowerBuilder 呼叫外部的组件的方法,在以前能够让 PowerBuilder 呼叫 EJB 组件,就只能透过一些协力厂商开发的「COM Bridge」,让 PowerBuilder 式透过 COM 组件来呼叫 Java 至于 Java 或是 C++ PowerBuilder 程序的话,过去最常见的方法就是把这个 PowerBuilder 的程序包装成为「OLE automation server些方法都不是一个真正解决的好方法,说穿了,这些方法 跟本就没有办法直接和 PowerBuilder 的核心「PowerBuilder Visual Machine」做沟 通,所以在过去的版本的 PowerBuilder,是一直有这种和其它语言程序不能沟通 的困扰,这也是大家一直认为,PowerBuilder 是一个封闭不开放的开发工具。

 

 

PowerBuilder 9 这个版本有几个突破性的技术,而 PBNI 就是其中一个。所谓的 PBNI (PowerBuilder Native Interface),指的是 PowerBuilder 提供一个原生接口 (Native Interface)过这个接口可以使得 PowerBuilder 提高了其他程序语言 的扩展能力,比方说透过该界面可以存取任何类型的外部应用应用程序,或是让 外界其它的程序语言存取或是呼叫 PowerBuilder 开发的程下面一个简单的 PBNI 的示意图:

 

 

 


在上面这张图中,PBNI 提供了两道让外界可以和 PowerBuilder 核心(PBVM)的介 面窗第一个对外的窗口是指在图的右半我们可以开PB Extension」, PB Extension 其实最后会变成 DLL透过该C 或是 C++ DLL 程序可以包 装成为一PBD而该 PBD 的档就可以在开发程序加到 Library Search Path 中, PowerBuilder 直接存取 PBD 里的对象函数,你可以把它当作是 一个很像 PowerBuilder NVO 的东西来对待它。第二个对外的窗口是指在图的左半 你可以把 PowerBuilder Virtual Machine 「内嵌到一个 C++ 的应用程序中, C++程序中就可以直接呼叫 PowerScript Function

 

 

PBNI 的元素

 

 

 

PBNI 提供了一些基本的元素,透过这些元素,程序开发人员可以快速的引用外

部程序语言,下面是常见到的 PBNI 元素:

 

 

z     PBNI 提供的接口(Interface):

„    IPB_VM:这个接口作用,在于当你要用 C++或是其它的程序语言来 呼叫 PowerBuilder 开发的程序,或是你希望要和 PowerBuilder 的核心

PBVM」进行互动,或是沟通协调,你可以使用这个接口。

„    IPB_Session:这是一抽象的接口,这个接口可以用来定义诸如存取 PowerScript 里面的数建立 PowerBuilder 对象和呼叫 PowerScript 操作的方法

„    IPB_Value:这个接口你可以把它想象成是它就是代表 PowerBuilder 值。这些值可以是 PowerBuilder 的标准数据型态,例如 StringLong IntegerChar 等。以这个接口提供了关于每个变量的信息,包括变 数的类存取权限(PublicPrivate Protected)变量值或参数 存取方式(例如

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
服务端(jsxserver),采用c++ + iocp + pbni + zlib编写而成,支持PB长连结(提供pb客户端demo),支持http get post调用,pbni调用pbcall里的nvo_pbnicall(服务端业务代码全由PB编写),具体请看demo客户端代码中的说明; 实现的功能:1.pb客户端调用功能,可实现类似easerver iiop的功能,比easerver多了服务端心跳,客户端自动判断是否断网,自动重连,客户端单开线程序通迅,前端界面不会卡死(用eserver不管是iiop还是ws高锋期经常未响应卡半天),传输码流比easerver小,程序总体运行效率也高一些,支持http get post调用,做接口很容易实现;2.客房端点对点发消息(由服务端转发),可以实现类似在线聊天的功能,响应http post也可以通过服务端即时转发给PB的客户端,PB客户端生成响应数据返回http调用端,客户如果用的局域网系统,又想做移动端的远程查询(小数据量),软件供应商有公网服务器的话,可用本框架打通实现,我们用此框架实现过医生手机远程连入门诊内部查询修改自已的预约、患者资料;3.服务端即时通知功能,pb长连结客户端、http调用,服务端处理完成后,可以给在线的pb长连结客户端发通知消息,客户端收到通知后可即时做出相应操作,例如:酒店系统,前台开房后,全系统房态即时刷新,门诊系统患者前台挂号后,医生端即时就看的到,等等,比客户端轮询来的效果好。
PB9以上的PB版本适用。 使用只有三个函数,很简单。 这是用PBNI编写的控件,VC6的IDE,VC2003的编译器编译,UNICODE版本。 三个函数的使用说明: of_addtip(unsignedlong winhandle, string tip) 添加一个tip。这是必须首先调用的函数,即:在使用其他两个函数前,必须先调用此函数。 winhandle:窗口句柄,操作tip的窗口的句柄,tip的图标即用此窗口的图标。 tip: tip的字符内容。 of_modifytip(string title, string info) 修改tip的内容,并且动态将修改的内容立即显示。参数的含义明显。 of_deletetip() 删除tip. 对tip图标上的鼠标操作的处理: 原理是:图标上的所有windows消息,都会转发到参数winhandle所代表的窗口,作为该窗口的WM_USER消息,即触发该窗口的pbm_custom01事件。pbm_custom01事件的lparm参数指定tip图标的windows消息号。 具体作法:在参数winhandle所代表的窗口的pbm_custom01事件中写代码,检测lparm的值,以判断鼠标进行了哪种操作,如:lparm为517(WM_RBUTTONUP),表示鼠标弹起。 pbm_custom01中的示例代码: //start CONSTANT long WM_MOUSEMOVE = 512 CONSTANT long WM_LBUTTONDOWN = 513 CONSTANT long WM_LBUTTONUP = 514 CONSTANT long WM_LBUTTONDBLCLK = 515 CONSTANT long WM_RBUTTONDOWN = 516 CONSTANT long WM_RBUTTONUP = 517 CONSTANT long WM_RBUTTONDBLCLK = 518 CONSTANT long WM_USER = 1024 CONSTANT long NIN_BALLOONSHOW =(WM_USER + 2) CONSTANT long NIN_BALLOONHIDE =(WM_USER + 3) CONSTANT long NIN_BALLOONTIMEOUT =(WM_USER + 4) CONSTANT long NIN_BALLOONUSERCLICK =(WM_USER + 5) m_base lm_menu CHOOSE CASE lparam CASE WM_MOUSEMOVE // CASE WM_LBUTTONDOWN //鼠标左键按下 CASE WM_LBUTTONUP //鼠标左键弹起 CASE WM_LBUTTONDBLCLK //鼠标左键双击 CASE WM_RBUTTONDOWN // SetFocus ( this ) lm_menu = CREATE m_base lm_menu.PopMenu(PointerX(),PointerY()) DESTROY lm_menu CASE WM_RBUTTONUP // CASE WM_RBUTTONDBLCLK // CASE NIN_BALLOONSHOW // CASE NIN_BALLOONHIDE // CASE NIN_BALLOONTIMEOUT // CASE NIN_BALLOONUSERCLICK // CASE ELSE Beep(0) END CHOOSE //end 注意事项: 经测试,本PBNI如果与其他非UNICODE版的PBNI同用时,会显示乱码。无解。 如有BUG,敬请及时告知。 本控件的讨论贴: http://topic.csdn.net/u/20090510/20/14a57e09-02ca-44df-8f9b-e3811678360d.html

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值