首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

BCB 環境下 CORBA 客戶端開發指南:靜態與動態綁定完整解析

     編輯:關於C++

建立 CORBA 客戶端專案

使用 CORBA Client Wizard:File | New → Multitier 頁選取 "CORBA Client"。可選 Console 或 Windows 應用程式,並決定是否使用 VCL(不使用 VCL 程式碼可跨平台)。建議在精靈中加入定義伺服器介面的 IDL 檔案,雖然可稍後透過 Project | Add to Project 加入。

精靈自動產生專案、加入 CORBA 函式庫、初始化 ORB:

CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);

若需透過 Callback 介面與伺服器互動,勾選精靈選項初始化 BOA。

取得伺服器物件參考:兩種綁定機制

客戶端不直接操作物件實例,而是取得 CORBA 物件參考進行操作。綁定方式取決於是否在編譯期知道介面與物件:

  • 靜態綁定:編譯期已知介面,使用 Edit | Use CORBA Object 精靈。優點:速度較快、提供編譯期型別檢查、程式碼自動完成。
  • 動態綁定:執行期才知道介面/物件,使用動態調用介面 (DII),透過 CORBA::Any 類型封裝參數。

使用存根類別 (Static Binding)

編譯 IDL 時自動產生存根類別 (xxx_c.cpp/h),無需手動編輯。透過 Use CORBA Object Wizard 具現化存根:

  • VCL Windows 應用:在表單類別中建立屬性儲存存根實例。
  • Console 應用:在 main() 中建立區域變數。
  • 通用機制:向導加入必要標頭檔、產生綁定程式碼。

範例:Console 應用綁定程式碼

#include <corba.h>
#include <condefs.h>
#include "MyServerObj_c.hh"
#pragma argsused
int main(int argc, char* argv[]) {
    try {
        CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
        MyServerObj_var TheObject = MyServerObj::_bind("InstanceName");
        // 使用 TheObject 呼叫方法...
    } catch (const CORBA::Exception& e) {
        cerr << e << endl;
        return 1;
    }
    return 0;
}

重要警告:存根變數必須為區域變數或類別資料成員,不可使用全域變數。全域存根會在 ORB 釋放前持有參考計數,導致資源洩漏。若必須用全域,請在 ORB 釋放前設為 NULL 解除綁定。

若專案僅包含客戶端單元 (xxx_c),無法使用精靈,需自行撰寫綁定程式碼,可利用 VisiBroker 綁定選項(指定特定伺服器、停用自動重綁等)。

動態調用介面 (DII) 完整流程

DII 允許無存根類別調用伺服器物件,但需手動編碼/解碼型別資訊,效能較低。

  1. 建立通用 CORBA 物件,指定介面 ID:
CORBA::Object_var diiObj;
try {
    diiObj = orb->bind("IDL:ServerObj:1.0");
} catch (const CORBA::Exception& E) {
    // 處理綁定例外
}
  1. 建立請求物件,指定方法名稱:
CORBA::Request_var req = diiObj->_request("methodName");
  1. 加入參數(CORBA::Any 類似 BCB Variant):
CORBA::Any arg;
arg <<= (const char*)"argvalue";
CORBA::NVList_ptr arguments = req->arguments();
arguments->add_value("arg1", arg, CORBA::ARG_IN);
  1. 發起調用:
req->invoke();
  1. 檢查錯誤與提取結果:
if (req->env()->exception()) {
    // 處理例外
} else {
    CORBA::Any_ptr pRetVal = req->result()->value();
    CORBA::Float val;
    *pRetVal >>= val;
}

DII 詳細用法請參考 VisiBroker Developer's Guide。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved