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

C++ Builder 實作 CORBA Name Service 完整教學

     編輯:關於C++

在使用 C++ Builder 4 (BCB4) 開發 CORBA 應用時,若直接使用內建的 CORBA Server Wizard 往往會遇到莫名其妙的問題,而 VisiBroker 提供的範例卻能正常編譯執行。本文記錄從頭手動建立 CORBA Server 並整合 Name Service 的完整步驟,幫助開發者避開常見陷阱。

一、建立 IDL 介面定義

檔案:order.idl

interface Order {
    string Name();
};

二、建立 Console 應用程式專案

  1. File → New → Console Wizard,產生無 VCL 支援的 Console 專案。
  2. Project → Add to Project 加入 order.idl,編譯專案產生 Stub/Skeleton 程式碼。

三、實作 CORBA 物件

File → New → Multitier → Corba Object Implementation,選擇 order.idl 介面 Order,自動產生 OrderServer.cpp。修改實作:

char* OrderImpl::Name() {
    return "Hi, I am Test CorbaServer";
}

儲存專案為 tcnServer.bpr,編譯執行測試。

四、驗證伺服器註冊

在命令列執行 osfind.exe(位於 VisiBroker bin 目錄),確認輸出中出現:

REPOSITORY ID: IDL:Order:1.0
OBJECT NAME: OrderObject

表示伺服器已向 OAD(Object Activation Daemon)註冊成功。

五、整合 Name Service(命名服務)

  1. 在 tcnServer.cpp 加入標頭:#include "CosNaming_c.hh"
  2. Project → Add To Project 加入 $(VBroker)\lib\name_br.lib,專案會自動產生 USELIB 指令。
  3. 在 boa->obj_is_ready(&order_OrderObject); 之後插入綁定程式碼:
// 從命令列參數取得 NameComponent
const char* id   = argv[1];
const char* kind = argv[2];

// 取得預設 NamingContext
CosNaming::NamingContext_var context = CosNaming::NamingContext::_bind();

// 建立 Name 物件(單一 NameComponent)
CosNaming::Name name;
name.length(1);
name[0].id   = id;
name[0].kind = kind;

// 綁定物件參考
context->bind(name, &order_OrderObject);

cout << "The object is bound: \"" << name[0].id << "\" \"" << name[0].kind << "\"" << endl;

重新編譯專案。

六、啟動 Name Service 並測試

  1. 啟動 Naming Context Factory:start nameextf MyTester test.log
  2. 啟動伺服器並指定名稱:start tcnServer MyName MyKind
  3. 再次執行 osfind,應看到 OBJECT NAME: OrderObject 出現在 Repository 列表中。

七、建立 Client 端呼叫

Console Client

  1. 建立新 Console 專案,加入 order.idl。
  2. Edit → Use Corba Object,介面選 Order,Object Name 填 OrderObject。
  3. 註解掉 boa->impl_ready();。
  4. 加入 #include "CosNaming.hh" 並連結 name_br.lib。
  5. 在 main() 中解析名稱並呼叫:
const char* id = argv[1];
const char* kind = argv[2];
CosNaming::NamingContext_var context = CosNaming::NamingContext::_bind();
CosNaming::Name name;
name.length(1); name[0].id = id; name[0].kind = kind;
CORBA::Object_var obj = context->resolve(name);
Order_var order = Order::_narrow(obj);
cout << "test result: " << order->Name() << endl;

GUI Client (Windows 應用程式)

  1. File → New → Multitier → Corba Client (GUI),選 order.idl。
  2. Edit → Use Corba Object,Object Name 填 OrderObject。
  3. 表單放置 Edit、Button,撰寫動態解析名稱程式碼:
try {
    Edit1->Text = "正在查找名為:{" + Edit2->Text + "," + Edit3->Text + "}的對象";
    CosNaming::NamingContext_var context = CosNaming::NamingContext::_bind();
    CosNaming::Name name;
    char id[32], kind[32];
    strcpy(id, Edit2->Text.c_str());
    strcpy(kind, Edit3->Text.c_str());
    name.length(1);
    name[0].id = id; name[0].kind = kind;
    CORBA::Object_var object = context->resolve(name);
    Order_var test = Order::_narrow(object);
    if (!CORBA::is_nil(test))
        Edit1->Text = AnsiString(test->Name());
    else
        Edit1->Text = "訪問失敗!";
}
catch (const CORBA::Exception& e) {
    ShowMessage(e._description.name());
    exit(1);
}

八、重要補充說明

  • 伺服器未註銷名稱,重複啟動需更換名稱或刪除 test.log 重新開始。
  • nameextf 不需頻繁重啟,保留 test.log 可維持命名狀態。
  • 若綁定名稱對應的物件實例在記憶體中,存取速度最快;其他名稱需經過 OAD 啟動,延遲 3~5 秒。
  • 建議手動建立專案而非依賴 Wizard,可避免不明環境配置問題。

完整範例專案包含 Console Server、GUI Server、Console Client、GUI Client,可作為 CORBA 開發的參考基礎。

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