• 一、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

      

  • 相关阅读:
    【Nginx】Nginx性能优化及配置文件
    【算法】常见算法分类和思想
    【PHP】php位运算及其高级应用
    【数据结构】数据结构-图的基本概念
    【Redis】Redis缓存穿透解决方案之布隆过滤器
    【Linux】Linux系统5种IO模型
    【linux】/dev/null作用和/dev/random
    【Linux】Linux查找功能
    【算法】算法复杂度
    Docker Hub公共镜像仓库的使用
  • 原文地址:https://www.cnblogs.com/wangxianjin/p/3994240.html
Copyright © 2020-2023  润新知