标签:des style blog http color io os 使用 ar
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函数返回。
在解决方案资源管理器的PBNIHello项目上右击,弹出右键菜单选择属性,在配置属性的常规页中设置如下:配置选择所有配置,平台为win32,平台工具集为VS2013Visual studio2013 – windowsXP,字符集为UNICODE(若编译PB9的PBNI选择为使用多字节字符集)
点击应用按钮。
在C/C++的常规下的附加包含目录选择编译,弹出窗口中新增输入$(PBNISDK125)\include
点击确定返回到PBNIHello属性页。
点击应用按钮。
在链接器的常规页的附加库目录选择编辑,弹出的窗口中新增输入$(PBNISDK125)\lib点击确定返回到PBNIHello属性页。点击应用按钮。
在链接器的输入页的附加依赖项中选择编辑,在弹出窗口中新增输入pbni.lib点击确定返回到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 };
在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 }
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 }
细心的你会发现
_T("class n_pbnihello from nonvisualobject \n") \
_T(" function string of_hellopbni(string username) \n") \
_T("end class \n")
这段代码很像PowerBuilder中非可视对象的代码。此字符串就是供PowerBuilder工具生成一个PowerBuilder非可视对象的壳。
博客地址:http://www.cnblogs.com/wangxianjin/p/3994240.html
标签:des style blog http color io os 使用 ar
原文地址:http://www.cnblogs.com/wangxianjin/p/3994240.html