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函數返回。
- 先不要啟動VS2013,在系統屬性中設置PB12.5的PBNI環境變量,系統屬性->環境變量->新建(W)….,在編輯系統變量窗口中輸入變量名稱“PBNISDK125”(此名稱可按自己愛好取),變量值為PB125.2PBNI安裝目錄,這里為“C:\Program Files (x86)\Sybase\PowerBuilder12.5\SDK\PBNI”(根據實際安裝情況填寫)
- 啟動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 <PBEXT.H>
- 建立一個頭文件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 };
在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 }
- 在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 }
細心的你會發現
_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選項編譯。
-
PBNI QQ交流群:119231276
博客地址:http://www.cnblogs.com/wangxianjin/p/3994240.html