PowerBuilder Native Interface (PBNI) 是 PowerBuilder 與原生 C++ 代碼互操作的橋樑。它允許將第三方 C++ 庫封裝為 PowerBuilder 物件直接調用,也支持將 PB 虛擬機嵌入 C++ 應用。關鍵限制:每個 PB 版本都必須編譯對應版本的 PBNI 組件,不可混用。
pbni.h、pbshr125.dll 等)PBNI_Hello。include 路徑(含 pbni.h)。lib 目錄。pbshr125.lib(對應 PB12.5)。PBNI_VERSION=500(PB12.5 對應版本號)。MachineX86(PB 12.5 為 32 位)。of_hellopbni目標:實現一個 PBNI 物件方法,接收字串參數並原樣返回。
// PowerBuilder 端定義
nonvisualobject nvo_pbni_test
function string of_hellopbni(string as_input);
end nonvisualobject
#include "pbni.h" #include// 實現 PBNI 類別 class PBNI_Hello : public IPBX_NonVisualObject { public: // PBNI 必須實現的虛函數 virtual PBXRESULT Invoke(PBX_Session* session, pbobject obj, pbmethodID mid, PBCallInfo* ci) { // 解析參數:ci->pArgs[0] 為輸入字串 pbarray args = ci->pArgs; pbvalue* pVal = args->GetAt(0); std::string input = pVal->GetString(); // 簡化處理,實際需用 PBX_GetString // 設置返回值 ci->returnValue->SetString(input.c_str()); return PBX_OK; } virtual PBXRESULT Destroy(PBX_Session* session, pbobject obj) { delete this; return PBX_OK; } }; // 導出函數:PB 虛擬機載入 DLL 時調用 PBX_EXPORT PBXRESULT PBX_CreateNonVisualObject(PBX_Session* session, pbclassID cid, pbobject* obj) { *obj = new PBNI_Hello(); return PBX_OK; }
// PB 代碼
PBNI_Hello pbni_obj
pbni_obj = CREATE PBNI_Hello
string ls_rtn
ls_rtn = pbni_obj.of_hellopbni("wxj") // 返回 "wxj"
DESTROY pbni_obj
wchar_t/std::wstring 或 PBNI 提供的字串轉換 API。pb125.exe 路徑,命令參數傳入測試用的 .pbt 專案,即可斷點調試 C++ 代碼。PBNI Programmer's Guide(PB 安裝目錄 Help 資料夾)掌握 PBNI,即可讓 PowerBuilder 突破語言邊界,直接調用高性能 C++ 算法、硬體驅動或第三方 SDK,極大拓展應用能力邊界。