PBNI整理版本剖析.docx

上传人:b****1 文档编号:546657 上传时间:2022-10-11 格式:DOCX 页数:13 大小:107.23KB
下载 相关 举报
PBNI整理版本剖析.docx_第1页
第1页 / 共13页
PBNI整理版本剖析.docx_第2页
第2页 / 共13页
PBNI整理版本剖析.docx_第3页
第3页 / 共13页
PBNI整理版本剖析.docx_第4页
第4页 / 共13页
PBNI整理版本剖析.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

PBNI整理版本剖析.docx

《PBNI整理版本剖析.docx》由会员分享,可在线阅读,更多相关《PBNI整理版本剖析.docx(13页珍藏版)》请在冰豆网上搜索。

PBNI整理版本剖析.docx

PBNI整理版本剖析

PBNI是Powerbuilder的本机扩展,是很强大的东东,最近因为工作需要,稍作了点研究,希望对未做过PBNI的朋友,有所帮助。

用最简单的的话来讲,(不准确),就是Java,C++里可以加载PB的虚拟机,利用PB的对象,语言,主要是利用PB在某些方面的强大功能,让他们能很好的结合。

PB安装目录SDK下的文件非常重要,要阅读下PB自带的帮助文档。

Powerbuilder9的版本只支持vs6,10.5的最高支持到VS2005,如果要想让PBNI支持到VS2008,并且集成到appwiz里,需要手动来做。

%Sybase\Pb105\PowerBuilder10.5\SDK\PBNI\Wizards\VCWizards\PBNIWizard8,此目录下的deploy.bat文件有时执行不一定成功,手动就可以,按照里边的步骤做,做完后,%Sybase\Pb105\PowerBuilder10.5\SDK\PBNI\Wizards\VCProjects8.0,这个目录下的文件PBNIWizard.vsz文件用UE打开,将8.0改为9.0,再复制到相应目录,就可以在VS2008里用向导创建PBNI工程了。

还有一点要提醒的是,一定要使用向导来创建PBNI,否则很容易挂哦

PowerBuilder9开发技术讲座—PowerBuilderNativeInterface(PBNI)PowerBuilder9现在对于其他开发语言的支援,有了全新的突破,在以往使用PowerBuilder开发程式时,要和C++或是Java程式互通有无是有一些折衷的办法,但是总是没有办法做到简易而且全面性的支援。

现在只要透过PowerBuilder9的PBNI技术,就可以让PowerBuilder的程式呼叫Java,或是在一个C++的程式中引用PowerBuilderNVO物件函数。

以往的PowerBuilder程式只能够透过外在函数呼叫的方式来存取C/C++的函数,但在PowerBuilder9.0之中扩增了一项强而有力的介面-「PowerBuilderNativeInterface」,简称PBNI。

透过PBNI的开发方式,PowerBuilder开发人员不仅可以使用物件导向的方式来存取C/C++函数,而且还可反向地让C/C++程式呼叫PowerBuilder之中的物件,达到应用程式的整合。

更甚者,在藉由JNI与PBNI两者的结合,Java应用程式也可双向地与PowerBuilder程式沟通。

何谓PBNI

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

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

2.开发人员有办法用PowerBuilder程式呼叫一些外部元件像是JavaEJB元件、WebService元件、JavaClass程式等诸如此类的元件吗?

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

上述三个问题,在过去的PowerBuilder其实都可以做到某种程度的地步,只是都有些问题。

传统上使用PowerBuilder开发上述的程式时,如果要呼叫C或是C++的程式,是可以使用宣告外部函数的方式来使用一个已经撰写好的DLL函数,

例如:

FUNCTIONulongGetSysColor(intindex)LIBRARY"USER32.DLL”

FUNCTIONbooleansndPlaySoundA(stringSoundName,uintFlags)LIBRARY"WINMM.DLL"

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

BOOLEnumWindows(WNDENUMPROClpEnumFunc,LPARAMlParam);

这个可是个大问题了,因为这个WindowsDLLFunction中会用到所谓的「Callback」函数的技术,所谓的CallbackFunction指的是今天有A和B两个物件,在程式中A物件呼叫B物件的Function,而在该B物件的Function又会回头呼叫A物件的其他Function,这就叫「Callback」。

在PowerBuilder呼叫C的Function后,在这个C的Function中要再回头呼叫PowerBuilder的函数是不可能用引用外部函数的方式来达到这个目地的。

除了CallbackFunction使用困难之外,使用外部函数也有资料型态的限制,以及没有办法使用物件导向的方式开发等种种的困难及问题。

再来谈谈PowerBuilder呼叫外部的元件的方法,在以前能够让PowerBuilder呼叫EJB元件,就只能透过一些协力厂商开发的「COMBridge」,让PowerBuilder程式透过COM元件来呼叫Java程式。

至于要让Java或是C++来呼叫PowerBuilder程式的话,过去最常见的方法就是把这个PowerBuilder的程式包装成为「OLEautomationserver」。

这些方法都不是一个真正解决的好方法,说穿了,这些方法跟本就没有办法直接和PowerBuilder的核心「PowerBuilderVisualMachine」做沟通,所以在过去的版本的PowerBuilder,是一直有这种和其他语言程式不能沟通的困扰,这也是大家一直认为,PowerBuilder是一个封闭不开放的开发工具。

PowerBuilder9这个版本有几个突破性的技术,而PBNI就是其中一个。

所谓的PBNI(PowerBuilderNativeInterface),指的是PowerBuilder提供一个「原生介面(NativeInterface)」,透过这个介面可以使得PowerBuilder提高了对其他程式语言的扩展能力,比方说透过该介面可以存取任何类型的外部应用应用程式,或是让外界其他的程式语言存取或是呼叫PowerBuilder开发的程式,下面是一个简单的

PBNI的示意图:

此主题相关图片如下:

1.jpg

在上面这张图中,PBNI提供了两道让外界可以和PowerBuilder核心(PBVM)的介面窗口,第一个对外的窗口是指在图的右半边,我们可以开发「PBExtension」,PBExtension其实最后会变成DLL,透过该技术,C或是C++的DLL程式可以包装成为一个「PBD」的档案,而该PBD的档案就可以在开发程式时,加到LibrarySearchPath中,让PowerBuilder直接存取PBD里的物件函数,你可以把它当作是一个很像PowerBuilderNVO的东西来对待它。

第二个对外的窗口是指在图的左半边,你可以把PowerBuilderVirtualMachine「内嵌」到一个C++的应用程式中,在C++程式中就可以直接呼叫PowerScriptFunction。

PBNI的元素

PBNI提供了一些基本的元素,透过这些元素,程式开发人员可以快速的引用外部程式语言,下面是常见到的PBNI元素:

?

?

PBNI提供的介面(Interface):

?

?

IPB_VM:

这个介面的作用,在于当你要用C++或是其他的程式语言来呼叫PowerBuilder开发的程式,或是你希望要和PowerBuilder的核心「PBVM」进行互动,或是沟通协调,你可以使用这个介面。

?

?

IPB_Session:

这是一个抽象的介面,这个介面可以用来定义诸如存取PowerScript里面的资料、建立PowerBuilder物件和呼叫PowerScript函数操作的方法

?

?

IPB_Value:

这个介面你可以把它想像成是它就是代表PowerBuilder的值。

这些值可以是PowerBuilder的标准资料型态,例如String、Long、Integer、Char等等。

所以这个介面提供了关于每个变数的资讯,包括变数的类型、标记、存取权限(Public、Private和Protected)、变数值或参数存取方式(例如CallbyValue或是Reference)。

?

?

IPB_Arguments:

这个介面可以让使用者在PowerBuilderVM和「PBExtension」间传递参数。

?

?

IPBX_NonVisualObject和IPBX_VisualObject:

这两介面很意思,因为它们可以在C++程式中实作出来,而且是放在PBExtension里面,你在PowerBuilder中就可以用PBD的方式看到你实作出来的物件,而要写这些可见或是不可见的物件,靠的就是IPBX_NonVisualObject和IPBX_VisualObject介面。

?

?

IPBX_Marshaler:

这个介面是当你要出一个「PBmarshalerextension」时,一定要实作出IPBX_Marshaler这个`介面。

这个介面尤其是你要由PowerBuilder呼叫Java程式时,一定要用到的一个介面。

?

?

PBNI提供的Structures:

?

?

PBCallInfo:

这个Structure可以在开发PBNI程式时,让PBNI和PowerBuilder之间呼叫的函数保持参数和回传值的资讯。

如果要存取在PBCallInfo中的资讯,可以使用IPB_Arguments介面来获得PBCallInfo。

?

?

PBArrayInfo:

PBArrayInfo是一个C++的structure,这个Structure可以在阵列中保持一些资讯。

?

?

PBNI提供的GlobleFunction:

如果你要写一个PowerBuilderextension的程式(说穿了就是用C++写一个DLL档啦),这个物件必须要汇出两个GlobalFunctions,让这个程式可以「内

嵌」PowerBuilderVM并且建立实体出来。

下面是PBNI提供的GlobleFunction:

?

?

PBX_GetDescription()

?

?

PBX_CreateNonVisualObject()

?

?

PBX_CreateVisualObject()

?

?

PBX_InvokeGlobalFunction()

?

?

PBNI提供的Helperclasses:

HelperClasses指的是一些辅助的类别物件,PBNI提供像是PBObjectCreator、PBArrayAccessor和PBEventTrigger等辅助类别,透过这些辅助类别物件可使PBNI在开发上更简单。

PBNI的开发方式

在了解PBNI有那些元素后,读着应该也了解到何谓PBNI,并且知道PBNI能帮我们做什么。

在针对不同的目地,PBNI也有不同的开发方式,常见的PBNI开发目地为下列四个,在后面的部份会祥细的说明PBNI的开发方式为何:

?

?

建立PBextensions

?

?

建立PBmarshalerextensions

?

?

建立PBvisualextensions

?

?

内嵌PBVM到C++的应用程式中

建立PBextensions步骤

之前有跟各位读者提过,PBNI提供了两个对外的方法,其中一种就是将C或是C++写好的DLL档案,透过PBNI提供的介面来包装成一个PowerBuilder认得的PBD档案,这种方式称之为建立「PBExtensions」。

在开发一个PBExtensions的程式时,我们必须先设想好,最后我们要产生的PBD中,会有那些物件。

比方说,我现在手头上正在写一个C++的程式,我希望这个C++的程式最后透过PBNI的帮助,产生一个PBD档案,而且在这个PBD里面有一个Funtion物件,而这个F

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1