使用 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 物件參考進行操作。綁定方式取決於是否在編譯期知道介面與物件:
CORBA::Any 類型封裝參數。編譯 IDL 時自動產生存根類別 (xxx_c.cpp/h),無需手動編輯。透過 Use CORBA Object Wizard 具現化存根:
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 允許無存根類別調用伺服器物件,但需手動編碼/解碼型別資訊,效能較低。
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::Any 類似 BCB Variant):CORBA::Any arg;
arg <<= (const char*)"argvalue";
CORBA::NVList_ptr arguments = req->arguments();
arguments->add_value("arg1", arg, CORBA::ARG_IN);
req->invoke();
if (req->env()->exception()) {
// 處理例外
} else {
CORBA::Any_ptr pRetVal = req->result()->value();
CORBA::Float val;
*pRetVal >>= val;
}
DII 詳細用法請參考 VisiBroker Developer's Guide。