在C#中呼叫PowerBuilder NVOs

本文介绍了如何在C#中利用PowerBuilder Native Interface (PBNI) 调用PowerBuilder的非可视对象(NVOs)。通过PBNI,开发者可以扩展PowerBuilder的功能,并在多种语言中重用PowerBuilder组件。文章详细阐述了使用PBNI的步骤,包括加载库文件、创建会话、查找NVO、调用方法等,并给出了C++和C#之间的参数封送示例。

我们怎样在.NET应用中重用PowerBuilder中的非可视用于对象(NVOs)呢?在PowerBuilder 9.0版本之前,我们可以通过PowerBuilder Automation技术或者采用三层的解决方案。

随之后来,我们可以将所有的NVOs托管在EAServer上面,从而作为中间组件层。

自PowerBuilder 9.0版本开始,PowerBuilder 提供了一个全新的与PowerBuilder虚拟机(PBVM)进行交互的接口-PowerBuilder Native Interface(PBNI).在这篇文章中,我将向大家介绍怎么在非托管的C++代码中使用PBNI,以及向C#托管代码封送参数,以便你可以通过C#调用PowerBuilder NVOs.

PBNI介绍(PowerBuilder Native Interface)

PBNI是在PowerBuilder 9.0版本中引入的一个新特性。且只在企业版本中可用,安装在%PowerBuilder安装目录%/SDK/PBNI中.你可以在inlcude目录下面找到你所需要的全部头文件。

PBNI是一个标准的编程接口,通过它开发人员可以扩展PowerBuilder的功能。你可以使用PBNI创建PowerBuilder的可视和非可视扩展(封送扩展),同时你也可以将PowerBuilder virtual machine(PBVM)内嵌到C++应用中.与PowerBuilder automation相比而言,PBNI具有一下优点:

· 它不仅只是重用已存在的NVOs. 可以使用PBNI扩展PowerBuilder,使其可以提供诸如XML parsing和Web service整合的功能.

· 不是基于COM技术的解决方案,因此不需要注册设置。也可以部署到非Windows平台上面.

· 多种语言都可以重用PowerBuilder组件.例如,基于Java的应用可以使用JNI,经由PBNI调用PowerBuilder组件。

· 大部分的PowerBuilder内建特性可以迁移到PowerBuilder扩展中,这样PowerBuilder的核心(PBVM)将会缩小.应用部署的大小会依据所需要使用的特性而变化。

怎么使用

PBNI提供预定义的C++接口,允许PBVM与其他语言进行交互(请看图1). Table 1列出了一些重要的接口

clip_image002

clip_image004

在非托管的代码中呼叫PowerBuilder NVO

使用PBNI调用PowerBuilder NVO,你需要按照下述步骤:

1. 标识所需要的PowerBuilder库文件以及在NVO中的方法签名字符串.可以通过PowerBuilder库面板来完成,在需要获取方法签名的NVO节点下面对应的方法上点击鼠标右键并选择<属性>,则显示在"Signature"文本框中的就是方法签名字符串(请看图2).

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.youkuaiyun.com/u/20090510/20/14a57e09-02ca-44df-8f9b-e3811678360d.html
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值