zoukankan      html  css  js  c++  java
  • 一、PBNI环境搭建及初步使用

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

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

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

      点击完成。VS2013中,解决方案资源管理器中如下:
    4. 设置PBNIIncludeLib路径:

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

      点击应用按钮。

      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类
       1 #pragma once
       2 
       3 class PBNIHello :
       4     public IPBX_NonVisualObject
       5 {
       6 private:
       7     IPB_Session * m_pSession;
       8     pbobject m_pbobject;
       9 public:
      10     PBNIHello(IPB_Session * pSession, pbobject obj)
      11         :m_pSession(pSession),
      12         m_pbobject(obj)
      13     {
      14     };
      15     ~PBNIHello(void){};
      16     PBXRESULT Invoke(IPB_Session * session, pbobject obj, pbmethodID mid, PBCallInfo * ci);
      17     void Destroy()
      18     {
      19         delete this;
      20     }
      21     enum Function_Entrys
      22     {
      23         mid_HelloPBNI=0,
      24         NO_MORE_METHODS
      25     };
      26 protected:
      27     PBXRESULT HelloPBNI(PBCallInfo* ci);
      28 };
      View Code

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

       1 #include "stdafx.h"
       2 #include "PBNIHello.h"
       3 
       4 PBXRESULT PBNIHello::Invoke(IPB_Session * session, pbobject obj, pbmethodID mid, PBCallInfo * ci)
       5 {
       6     PBXRESULT pbxr = PBX_OK;
       7     switch (mid)
       8     {
       9     case mid_HelloPBNI:
      10         pbxr = HelloPBNI(ci);
      11         break;
      12     default:
      13         pbxr = PBX_E_INVOKE_METHOD_AMBIGUOUS;
      14     }
      15     return pbxr;
      16 }
      17 PBXRESULT PBNIHello::HelloPBNI(PBCallInfo * ci)
      18 {
      19     PBXRESULT    pbxr = PBX_OK;
      20     LPCTSTR userName = m_pSession->GetString(ci->pArgs->GetAt(0)->GetString());
      21     ci->returnValue->SetString(userName);
      22     m_pSession->ReleaseString(userName);//PB9版本的PBNI没有此方法,编译时需要注释掉
      23     return pbxr;
      24 }
      View Code
    8. dllmain.cpp中实现导出PBX_GetDescription、PBX_CreateNonVisualObject函数,以便生成PowerBuilder对象
       1 #include "stdafx.h"
       2 #include "PBNIHello.h"
       3 BOOL APIENTRY DllMain( HMODULE hModule,
       4                        DWORD  ul_reason_for_call,
       5                        LPVOID lpReserved
       6                      )
       7 {
       8     switch (ul_reason_for_call)
       9     {
      10     case DLL_PROCESS_ATTACH:
      11     case DLL_THREAD_ATTACH:
      12     case DLL_THREAD_DETACH:
      13     case DLL_PROCESS_DETACH:
      14         break;
      15     }
      16     return TRUE;
      17 }
      18 PBXEXPORT LPCTSTR PBXCALL PBX_GetDescription()
      19 {
      20     static const TCHAR classDesc[] = {
      21         _T("class n_pbnihello from nonvisualobject 
      ") 
      22         _T("    function string of_hellopbni(string username) 
      ") 
      23         _T("end class 
      ")
      24     };
      25     return (LPCTSTR)classDesc;
      26 }
      27 PBXEXPORT PBXRESULT PBXCALL PBX_CreateNonVisualObject(
      28     IPB_Session * session,
      29     pbobject obj,
      30     LPCTSTR className,
      31     IPBX_NonVisualObject ** nvobj
      32 )
      33 {
      34     if (_tcscmp(className, _T("n_pbnihello")) == 0)
      35         *nvobj = new PBNIHello(session, obj);
      36     return PBX_OK;
      37 }
      View Code

      细心的你会发现

        _T("class n_pbnihello from nonvisualobject ")
        _T(" function string of_hellopbni(string username) ")
        _T("end class ")
       这段代码很像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

      

  • 相关阅读:
    二分图 洛谷P2055 [ZJOI2009]假期的宿舍
    并查集 洛谷P1640 [SCOI2010]连续攻击游戏
    贪心 洛谷P2870 Best Cow Line, Gold
    贪心 NOIP2013 积木大赛
    快速幂 NOIP2013 转圈游戏
    倍增LCA NOIP2013 货车运输
    树形DP 洛谷P2014 选课
    KMP UVA1328 Period
    动态规划入门 BZOJ 1270 雷涛的小猫
    KMP POJ 2752Seek the Name, Seek the Fame
  • 原文地址:https://www.cnblogs.com/wangxianjin/p/3994240.html
Copyright © 2011-2022 走看看