一、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)\Sybase\PowerBuilder12.5\SDK\PBNI”(根據實際安裝情況填寫)
  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 \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非可視對象的殼。

  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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM