File → New → Multitier → CORBA ClientProject → Add to Project 加入)。Wizard 自動生成 ORB 初始化程式碼:
CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
若需 Callback,勾選啟用 BOA(Basic Object Adapter)。
IDL 編譯生成 xxx_c.cpp、xxx_c.hh(Client Stubs)。切勿手動修改生成檔。
Edit → Use CORBA Objectmain() 區域變數實例化。WinMain() 變數實例化。#include
#include
#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;
}
Stub 釋放時會遞減 CORBA 參考計數,若為全域變數,釋放順序可能早於 orb,導致存取已釋放的 ORB。務必使用區域變數或類別成員;若必須全域,在 orb 釋放前手動設為 NULL 解除綁定。
無需 Stubs,執行期編碼/解碼參數,效能較低但極具彈性(介面未知時)。
CORBA::Object_var diiObj;
try { diiObj = orb->bind("IDL:ServerObj:1.0"); }
catch (const CORBA::Exception& e) { /* 處理綁定失敗 */ }
CORBA::Request_var req = diiObj->_request("methodName");CORBA::NVList 存放 CORBA::Any):
CORBA::Any arg; arg <<= (const char*)"argvalue";
CORBA::NVList_ptr args = req->arguments();
args->add_value("arg1", arg, CORBA::ARG_IN);
req->invoke();if (req->env()->exception()) { /* 處理例外 */ }
else {
CORBA::Any* result = req->result()->value();
CORBA::Float val; *result >>= val;
}
若專案僅包含生成的 Client 單元(無 IDL),無法使用 Wizard,需自行撰寫綁定程式碼。可利用 VisiBroker 專屬選項:指定特定伺服器、停用自動重新綁定等。詳見 VisiBroker 開發指南。
| 特性 | 靜態綁定 (Stubs) | 動態綁定 (DII) |
|---|---|---|
| 效能 | 高(編譯期編碼) | 較低(執行期編碼/解碼) |
| 型別安全 | 編譯期檢查 | 執行期檢查 |
| 程式碼完成提示 | 支援 | 無 |
| 適用場景 | 介面穩定、效能敏感 | 介面動態、外掛架構、Scripting |