PBNI环境搭建及初步使用讲解

文章资讯 2020-07-20 00:30:51

PBNI环境搭建及初步使用讲解

  下面讲解如何使用VS2013开发PB12.5版本PBNI组件环境搭配及简单PBNI应用实例:
  实现一个PBNI对象的函数of_hellopbni将参数传递进来,然后pbni函数返回,
  
//PowerBuilder代码
string ls_rtn
ls_rtn = pbni_obj.of_hellopbni("wxj")
  将wxj这个字符串原封不动的从of_hellopbni函数返回。
  先不要启动VS2013,在系统属性中设置PB12.5的PBNI环境变量,系统属性->环境变量->新建(W)….,在编辑系统变量窗口中输入变量名称“PBNISDK125”(此名称可按自己爱好取),变量值为PB125.2PBNI安装目录,这里为“C:Program Files (x86)SybasePowerBuilder12.5SDKPBNI”(根据实际安装情况填写)
启动VS2013,菜单中选择“文件”->“新建”->“项目”,建立空白解决方案,如下图:
单击确定。
建立一个VC++win32 dll项目:在解决方案资源管理器中的“解决方案PBNI”上右击弹出菜单选择“添加”->新建项目…,在弹出的添加新项目窗口中输入名称PBNIHello(名称可随意取)。
点击确定,VS切换到win32应用程序向导,单击下步,在应用程序设置中将应用程序类型选择“dll”
点击完成。在VS2013中,解决方案资源管理器中如下:
设置PBNI的Include和Lib路径:
在解决方案资源管理器的PBNIHello项目上右击,弹出右键菜单选择属性,在配置属性的常规页中设置如下:配置选择所有配置,平台为win32,平台工具集为VS2013Visual studio2013 – windowsXP,字符集为UNICODE(若编译PB9的PBNI选择为使用多字节字符集)
点击应用按钮。
在C/C++的常规下的附加包含目录选择编译,弹出窗口中新增输入$(PBNISDK125)include
点击确定返回到PBNIHello属性页。
点击应用按钮。
在链接器的常规页的附加库目录选择编辑,弹出的窗口中新增输入$(PBNISDK125)lib
点击确定返回到PBNIHello属性页。点击应用按钮。
在链接器的输入页的附加依赖项中选择编辑,在弹出窗口中新增输入pbni.lib点击确定返回到PBNIHello属性页,并在该属性页上点击确定。
打开头文件下的stdafx.h,在文件最后输入一行#include
建立一个头文件PBNIHello.h:在解决方案资源管理器的头文件上右击弹出菜单选择“添加”“新建项目”弹出窗口中选择vc++头文件,名称为PBNIHello.h
按添加返回,并在PBNIHello.cpp中输入#include "PBNIHello.h"

声明定义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

在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 n")
22 _T(" function string of_hellopbni(string username) n")
23 _T("end class n")
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 n")
_T(" function string of_hellopbni(string username) n")
_T("end class n")
这段代码很像PowerBuilder中非可视对象的代码。此字符串就是供PowerBuilder工具生成一个PowerBuilder非可视对象的壳。
选择解决方案配置为Debug,解决方案平台为win32

在解决方案资源管理器中的PBNIHello项目上右击弹出选择生成,VS2013开始编译代码。如有错误请修改错误直到编译成功。
在编译成功后,在解决方案的根目录下的Debug文件夹中生成一个PBNIHello.dll文件
在这个Debug目录下用PB125建立一个PB测试应用

在PBNItest库上右击弹出菜单选择“Import PB Extension….”,选择PBNIHello.dll文件打开导入PBNI对象到PB开发环境中。
导入成功后
创建窗体调试运行n_pbnihello.

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