PowerBuilder 9 开发技术讲座 —
PowerBuilder Native Interface(PBNI)
<摘自倍力技术小组>
PowerBuilder 9 现在对于其它开发语言的支持,有了全新的突破,在以往使用 PowerBuilder 开发程序时,要和 C++或是 Java 程序互通有无是有一些折衷的办 法,但是总是没有办法做到简易而且全面性的支持。现在只要透过 PowerBuilder
9 的 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.DLL” FUNCTION 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 的标准数据型态,例如 String、Long、 Integer、Char 等等。所以这个接口提供了关于每个变量的信息,包括变 数的类型、标记、存取权限(Public、Private 和 Protected)、变量值或参数 存取方式(例如