PowerBuilder Native Interface(PowerBuilder本机接口PBNI)允许将第3方程序转换为PowerBuilder对象,供PowerBuilder直接使用,也允许将PowerBuilder虚拟机嵌入到C++应用中。对于每个版本的PowerBuilder都需要编译对应版本的PBNI程序。

  下面讲解如何使用VS2013开发PB12.5版本PBNI组件环境搭配及简单PBNI应用实例:

  实现一个PBNI对象的函数of_hellopbni将参数传递进来,然后pbni函数返回,

  

//PowerBuilder代码
string ls_rtn
ls_rtn = pbni_obj.of_hellopbni("wxj")

  将wxj这个字符串原封不动的从of_hellopbni函数返回。

  1.   先不要启动VS2013,在系统属性中设置PB12.5的PBNI环境变量,系统属性->环境变量->新建(W)….,在编辑系统变量窗口中输入变量名称“PBNISDK125”(此名称可按自己爱好取),变量值为PB125.2PBNI安装目录,这里为“C:\Program Files (x86)\Sybase\PowerBuilder12.5\SDK\PBNI”(根据实际安装情况填写)
  2. 启动VS2013,菜单中选择“文件”->“新建”->“项目”,建立空白解决方案,如下图:

    单击确定。
  3. 建立一个VC++win32 dll项目:在解决方案资源管理器中的“解决方案PBNI”上右击弹出菜单选择“添加”->新建项目…,在弹出的添加新项目窗口中输入名称PBNIHello(名称可随意取)。

    点击确定,VS切换到win32应用程序向导,单击下步,在应用程序设置中将应用程序类型选择“dll”

    点击完成。在VS2013中,解决方案资源管理器中如下:
  4. 设置PBNI的Include和Lib路径:

    在解决方案资源管理器的PBNIHello项目上右击,弹出右键菜单选择属性,在配置属性的常规页中设置如下:配置选择所有配置,平台为win32,平台工具集为VS2013Visual studio2013 – windowsXP,字符集为UNICODE(若编译PB9的PBNI选择为使用多字节字符集)

    点击应用按钮。

    在C/C++的常规下的附加包含目录选择编译,弹出窗口中新增输入$(PBNISDK125)\include

    点击确定返回到PBNIHello属性页。

    点击应用按钮。

    在链接器的常规页的附加库目录选择编辑,弹出的窗口中新增输入$(PBNISDK125)\lib

    点击确定返回到PBNIHello属性页。点击应用按钮。

    在链接器的输入页的附加依赖项中选择编辑,在弹出窗口中新增输入pbni.lib点击确定返回到PBNIHello属性页,并在该属性页上点击确定。

  5. 打开头文件下的stdafx.h,在文件最后输入一行#include <PBEXT.H>
  6. 建立一个头文件PBNIHello.h:在解决方案资源管理器的头文件上右击弹出菜单选择“添加”“新建项目”弹出窗口中选择vc++头文件,名称为PBNIHello.h
    按添加返回,并在PBNIHello.cpp中输入#include "PBNIHello.h"
  7. 声明定义PBNIHello类:在头文件PBNIHello.h中声明PBNIHello类
     #pragma once
    
     class PBNIHello :
    public IPBX_NonVisualObject
    {
    private:
    IPB_Session * m_pSession;
    pbobject m_pbobject;
    public:
    PBNIHello(IPB_Session * pSession, pbobject obj)
    :m_pSession(pSession),
    m_pbobject(obj)
    {
    };
    ~PBNIHello(void){};
    PBXRESULT Invoke(IPB_Session * session, pbobject obj, pbmethodID mid, PBCallInfo * ci);
    void Destroy()
    {
    delete this;
    }
    enum Function_Entrys
    {
    mid_HelloPBNI=,
    NO_MORE_METHODS
    };
    protected:
    PBXRESULT HelloPBNI(PBCallInfo* ci);
    };

    在PBNIHello.cpp中实现PBNIHello类的Invoke和HelloPBNI方法:

     #include "stdafx.h"
    #include "PBNIHello.h" PBXRESULT PBNIHello::Invoke(IPB_Session * session, pbobject obj, pbmethodID mid, PBCallInfo * ci)
    {
    PBXRESULT pbxr = PBX_OK;
    switch (mid)
    {
    case mid_HelloPBNI:
    pbxr = HelloPBNI(ci);
    break;
    default:
    pbxr = PBX_E_INVOKE_METHOD_AMBIGUOUS;
    }
    return pbxr;
    }
    PBXRESULT PBNIHello::HelloPBNI(PBCallInfo * ci)
    {
    PBXRESULT pbxr = PBX_OK;
    LPCTSTR userName = m_pSession->GetString(ci->pArgs->GetAt()->GetString());
    ci->returnValue->SetString(userName);
    m_pSession->ReleaseString(userName);//PB9版本的PBNI没有此方法,编译时需要注释掉
    return pbxr;
    }
  8. 在dllmain.cpp中实现导出PBX_GetDescription、PBX_CreateNonVisualObject函数,以便生成PowerBuilder对象
     #include "stdafx.h"
    #include "PBNIHello.h"
    BOOL APIENTRY DllMain( HMODULE hModule,
    DWORD ul_reason_for_call,
    LPVOID lpReserved
    )
    {
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
    break;
    }
    return TRUE;
    }
    PBXEXPORT LPCTSTR PBXCALL PBX_GetDescription()
    {
    static const TCHAR classDesc[] = {
    _T("class n_pbnihello from nonvisualobject \n") \
    _T(" function string of_hellopbni(string username) \n") \
    _T("end class \n")
    };
    return (LPCTSTR)classDesc;
    }
    PBXEXPORT PBXRESULT PBXCALL PBX_CreateNonVisualObject(
    IPB_Session * session,
    pbobject obj,
    LPCTSTR className,
    IPBX_NonVisualObject ** nvobj
    )
    {
    if (_tcscmp(className, _T("n_pbnihello")) == )
    *nvobj = new PBNIHello(session, obj);
    return PBX_OK;
    }

    细心的你会发现

    _T("class n_pbnihello from nonvisualobject \n") \
      _T(" function string of_hellopbni(string username) \n") \
      _T("end class \n")
     这段代码很像PowerBuilder中非可视对象的代码。此字符串就是供PowerBuilder工具生成一个PowerBuilder非可视对象的壳。

  9. 选择解决方案配置为Debug,解决方案平台为win32

    在解决方案资源管理器中的PBNIHello项目上右击弹出选择生成,VS2013开始编译代码。如有错误请修改错误直到编译成功。
  10. 在编译成功后,在解决方案的根目录下的Debug文件夹中生成一个PBNIHello.dll文件
  11. 在这个Debug目录下用PB125建立一个PB测试应用
  12. 在PBNItest库上右击弹出菜单选择“Import PB Extension….”,选择PBNIHello.dll文件打开导入PBNI对象到PB开发环境中。

    导入成功后如图
  13. 创建窗体调试运行n_pbnihello.

    如果你按照步骤成功操作到此处,那么恭喜你,你学会了PBNI。 部署PBNI对象时候,请选用Release选项编译。
      PBNI QQ交流群:119231276

本文代码

博客地址:http://www.cnblogs.com/wangxianjin/p/3994240.html

  

一、PBNI环境搭建及初步使用的更多相关文章

  1. Spring学习笔记--环境搭建和初步理解IOC

    Spring框架是一个轻量级的框架,不依赖容器就能够运行,像重量级的框架EJB框架就必须运行在JBoss等支持EJB的容器中,核心思想是IOC,AOP,Spring能够协同Struts,hiberna ...

  2. UNIX环境编程初步认识——编程环境搭建

     前言 前期学习了Linux的一些基本知识后,在借助前期的学习的基础上想再初步认识一下操作系统的一些环境编程体系相关知识,当中环境的配置和搭建费了非常大的劲,须要一点点摸索和尝试,下边是环境搭建的 ...

  3. hadoop学习第一天-hadoop初步环境搭建&伪分布式计算配置(详细)

    一.虚拟机环境搭建 我们用的虚拟机为vmware,Linux镜像为centOS6.5. vmware安装 安装没什么多说的,一路下一步,但是在新建虚拟机的时候有两个地方需要注意: 1.分配处理器1个就 ...

  4. Hadoop学习笔记—22.Hadoop2.x环境搭建与配置

    自从2015年花了2个多月时间把Hadoop1.x的学习教程学习了一遍,对Hadoop这个神奇的小象有了一个初步的了解,还对每次学习的内容进行了总结,也形成了我的一个博文系列<Hadoop学习笔 ...

  5. 基于WDF的PCI/PCIe接口卡Windows驱动程序(1)-WDF概述及开发环境搭建

    原文出处:http://www.cnblogs.com/jacklu/p/4619110.html 本科毕业设计是这方面的工作,所以想开几篇博客来介绍使用WDF开发PCI/PCIe接口卡的驱动程序方法 ...

  6. ArcGIS API for JavaScript开发环境搭建及第一个实例demo

    原文:ArcGIS API for JavaScript开发环境搭建及第一个实例demo ESRI公司截止到目前已经发布了最新的ArcGIS Server for JavaScript API v3. ...

  7. spring+springMVC+mybatis的框架项目基础环境搭建

    上一个项目在后台用到spring+springMVC+mybatis的框架,先新项目初步需求也已经下来,不出意外的话,应该也是用这个框架组合. 虽然在之前activiti相关的学习中所用到的框架也是这 ...

  8. Hadoop项目开发环境搭建(Eclipse\MyEclipse + Maven)

    写在前面的话 可详细参考,一定得去看 HBase 开发环境搭建(Eclipse\MyEclipse + Maven) Zookeeper项目开发环境搭建(Eclipse\MyEclipse + Mav ...

  9. MapReduce 开发环境搭建(Eclipse\MyEclipse + Maven)

    写在前面的话 可详细参考,一定得去看 HBase 开发环境搭建(Eclipse\MyEclipse + Maven) Zookeeper项目开发环境搭建(Eclipse\MyEclipse + Mav ...

随机推荐

  1. 专访Linux嵌入式开发韦东山操作系统图书作者--转

    CSDN学院讲师韦东山:悦己之作,方能悦人 发表于2015-04-28 08:09| 6669次阅读| 来源CSDN| 24 条评论| 作者夏梦竹 专访Linux嵌入式开发韦东山操作系统图书作者 摘要 ...

  2. <转载> 优秀程序员必备的23条好习惯

    转自 优秀程序员必备的23条好习惯 编程是一项聪明人玩的游戏,它既是对智力的考验,也是对习惯的考验,智力的好坏取决于父母的基因,人们无从左右,但习惯的好坏却是可以不断培养.一项由美国芝加哥大学国家研究 ...

  3. java之抽象类

    1.用abstract关键字来修饰一个类时,这个类叫做抽象类:用abstract来修饰一个方法时,该方法叫做抽象方法. 2.含有抽象方法的类必须被声明抽象类,抽象类必须被继承,抽象方法必须被重写. 3 ...

  4. git merge之squash

    看CM源码时,发现历史记录里有很多squash,于是google了解了一下. Git相对于CVS和SVN的一大好处就是merge非常方便,只要指出branch的名字就好了,如: 1 2 3 4 5 $ ...

  5. java实现二叉树查找树

    二叉树(binary)是一种特殊的树.二叉树的每个节点最多只能有2个子节点: 二叉树 由于二叉树的子节点数目确定,所以可以直接采用上图方式在内存中实现.每个节点有一个左子节点(left childre ...

  6. maven中文乱码问题——打包错误

    工程采用GBK编码, web应用中的配置文件打包后,war包里的配置文件里的中文成乱码.   用notepad++打开后,可以看到是用utf-8格式的(可以通过菜单中的[格式]查看),也就是说,在经过 ...

  7. IIS6.0下 Asp.Net 拦截jpg请求

    之前用mvc写了一个接口,访问格式 http://ip:port/{id}-{type}.jpg来获取一个图片,在IIS7.0+运行毫无障碍,但是在IIS6.0下,直接提示文件不存在或者已删除. 经过 ...

  8. bat 结束进程

    @echo offEcho 先等待7秒..等待启动其他软件ping 127.0.0.1 -n 60Echo 正在杀死进程...taskkill /f /im funshion.exetaskkill ...

  9. Android 布局之GridLayout

    Android 布局之GridLayout 1 GridLayout简介 GridLayout是Android4.0新提供的网格矩阵形式的布局控件. GridLayout的继承关系如下:java.la ...

  10. Tips3:通过Layer下拉菜单来锁定游戏物体和控制物体的可视化

    通过把不同的游戏物体放在不同的Layer里面能对不同类的游戏物体进行很方便的控制,如果某些游戏物体创建后你不想再改动,如地面 装饰 什么的, 你可以通过点击Layer下拉菜单把它们锁定了 也可以通过控 ...