1、现在只要透过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之中的物件,达到应用程式的整合。更甚者,在
2、藉由JNI与PBNI两者的结合,Java应用程式也可双向地与PowerBuilder程式沟通。何谓PBNI在谈什么是PBNI之前,我们先来谈谈下面三个问题:1.开发人员有办法用PowerBuilder程式呼叫C或是C+的程式吗?2.开发人员有办法用PowerBuilder程式呼叫一些外部元件像是Java EJB元件、 Web Service元件、Java Class程式等诸如此类的元件吗?3.开发人员有办法用反过来,用C或是C+呼叫已经使用PowerBuilder开发好的程式吗?上述三个问题,在过去的PowerBuilder其实都可以做到某种程度的地步,只是都有些问题。传统上使用PowerBu
3、ilder开发上述的程式时,如果要呼叫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 Func
4、tion中会用到所谓的Callback 函数的技术,所谓的Callback Function指的是今天有A和B两个物件,在程式中A物件呼叫B物件的Function,而在该B物件的Function又会回头呼叫A物件的其他Function,这就叫Callback。在PowerBuilder呼叫C的Function后,在这个C的Function中要再回头呼叫PowerBuilder的函数是不可能用引用外部函数的方式来达到这个目地的。除了Callback Function使用困难之外,使用外部函数也有资料型态的限制,以及没有办法使用物件导向的方式开发等种种的困难及问题。再来谈谈PowerBuilder
5、呼叫外部的元件的方法,在以前能够让PowerBuilder呼叫EJB元件,就只能透过一些协力厂商开发的COM Bridge,让PowerBuilder程式透过COM元件来呼叫Java程式。至于要让Java或是C+来呼叫PowerBuilder 程式的话,过去最常见的方法就是把这个PowerBuilder的程式包装成为OLE automation server。这些方法都不是一个真正解决的好方法,说穿了,这些方法跟本就没有办法直接和PowerBuilder的核心PowerBuilder Visual Machine做沟通,所以在过去的版本的PowerBuilder,是一直有这种和其他语言程式不能
6、沟通的困扰,这也是大家一直认为,PowerBuilder是一个封闭不开放的开发工具。 PowerBuilder 9这个版本有几个突破性的技术,而PBNI就是其中一个。所谓的PBNI (PowerBuilder Native Interface),指的是PowerBuilder提供一个原生介面(Native Interface),透过这个介面可以使得PowerBuilder提高了对其他程式语言的扩展能力,比方说透过该介面可以存取任何类型的外部应用应用程式,或是让外界其他的程式语言存取或是呼叫PowerBuilder开发的程式,下面是一个简单的PBNI的示意图:此主题相关图片如下:1.jpg在上面
7、这张图中,PBNI提供了两道让外界可以和PowerBuilder核心(PBVM)的介面窗口,第一个对外的窗口是指在图的右半边,我们可以开发PB Extension, PB Extension其实最后会变成DLL,透过该技术,C或是C+的DLL程式可以包装成为一个PBD的档案,而该PBD的档案就可以在开发程式时,加到Library Search Path中,让PowerBuilder直接存取PBD里的物件函数,你可以把它当作是一个很像PowerBuilder NVO的东西来对待它。第二个对外的窗口是指在图的左半边,你可以把PowerBuilder Virtual Machine 内嵌到一个C+的
8、应用程式中, 在C+程式中就可以直接呼叫PowerScript Function。PBNI的元素PBNI提供了一些基本的元素,透过这些元素,程式开发人员可以快速的引用外部程式语言,下面是常见到的PBNI元素:? PBNI提供的介面(Interface): IPB_VM:这个介面的作用,在于当你要用C+或是其他的程式语言来呼叫PowerBuilder开发的程式,或是你希望要和PowerBuilder的核心PBVM进行互动,或是沟通协调,你可以使用这个介面。 IPB_Session:这是一个抽象的介面,这个介面可以用来定义诸如存取PowerScript里面的资料、建立PowerBuilder物件和
9、呼叫PowerScript函数操作的方法 IPB_Value:这个介面你可以把它想像成是它就是代表PowerBuilder的值。这些值可以是PowerBuilder的标准资料型态,例如String、Long、 Integer、Char等等。所以这个介面提供了关于每个变数的资讯,包括变数的类型、标记、存取权限(Public、Private和Protected)、变数值或参数存取方式(例如Call by Value或是Reference)。 IPB_Arguments:这个介面可以让使用者在PowerBuilder VM和PB Extension间传递参数。 IPBX_NonVisualObjec
10、t和IPBX_VisualObject:这两介面很意思,因为它们可以在C+程式中实作出来,而且是放在PB Extension里面,你在PowerBuilder中就可以用PBD的方式看到你实作出来的物件,而要写这些可见或是不可见的物件,靠的就是IPBX_NonVisualObject和IPBX_VisualObject介面。 IPBX_Marshaler:这个介面是当你要出一个PB marshaler extension 时, 一定要实作出IPBX_Marshaler这个介面。这个介面尤其是你要由PowerBuilder呼叫Java程式时,一定要用到的一个介面。 PBNI提供的Structure
11、s: PBCallInfo:这个Structure可以在开发PBNI程式时,让PBNI和PowerBuilder之间呼叫的函数保持参数和回传值的资讯。如果要存取在PBCallInfo中的资讯,可以使用IPB_Arguments介面来获得PBCallInfo。 PBArrayInfo:PBArrayInfo是一个C+的structure,这个Structure可以在阵列中保持一些资讯。 PBNI提供的Globle Function: 如果你要写一个PowerBuilder extension的程式(说穿了就是用C+写一个DLL档啦),这个物件必须要汇出两个Global Functions,让这个
12、程式可以内嵌 PowerBuilder VM并且建立实体出来。下面是PBNI提供的Globle Function: PBX_GetDescription() PBX_CreateNonVisualObject() PBX_CreateVisualObject() PBX_InvokeGlobalFunction() PBNI提供的Helper classes: Helper Classes指的是一些辅助的类别物件,PBNI提供像是PBObjectCreator、 PBArrayAccessor和PBEventTrigger等辅助类别,透过这些辅助类别物件可使PBNI在开发上更简单。PBNI的开
13、发方式在了解PBNI有那些元素后,读着应该也了解到何谓PBNI,并且知道PBNI能帮我们做什么。在针对不同的目地,PBNI也有不同的开发方式,常见的PBNI开发目地为下列四个,在后面的部份会祥细的说明PBNI的开发方式为何:建立PB extensions 建立PB marshaler extensions 建立PB visual extensions 内嵌PBVM到C+的应用程式中建立PB extensions步骤之前有跟各位读者提过,PBNI提供了两个对外的方法,其中一种就是将C或是C+写好的DLL档案,透过PBNI提供的介面来包装成一个PowerBuilder认得的PBD档案,这种方式称之为建立PB Extensions。在开发一个PB Extensions的程式时,我们必须先设想好,最后我们要产生的PBD中,会有那些物件。比方说,我现在手头上正在写一个C+的程式,我希望这个C+的程式最后透过PBNI 的帮助,产生一个PBD档案,而且在这个PBD里面有一个Funtion物件,而这个F
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1