程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> BCB環境下CORBA實做之客戶端

BCB環境下CORBA實做之客戶端

編輯:關於C++

建立一個CORBA客戶端

當你寫一個CORBA客戶時,第一步是確定客戶程序可以與客戶機上的ORB軟件交談。要做到這一點,使用CORBA Client wizard。選擇File|New並從New Item對話框的Multitier頁選擇標簽為CORBA Client的圖標。這個向導讓你說明是想建立一個控制台應用程序或是一個窗口應用程序。

正如CORBA服務器程序,你可以指定CORBA客戶是否使用VCL類。如果不選VCL復選框,所有生成的代碼均可被移植到其它平台上。

在CORBA Client wizard中加入任何所有定義了你想用的服務器對象界面的IDL文件。但也可以不使用任何IDL文件而建立CORBA客戶應用程序(確切的說是加入一個生成客戶單元到工種中)。這不是首選的方法。當工程包含服務器界面的IDL文件時,你可以用該向導來綁定到服務器上的對象上。

注意:如果你開始CORBA客戶工程時沒有加入IDL文件,還可以在任何時候用Project|Add to Project加入它。

CORBA Cleint wizard總是建立指定類型的客戶端工程,將CORBA庫加進工程文件並加入以下起動代碼以初始化ORB(Object Request Broker對象請求代理)。

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

如果你想通過CORBA服務器的CALLBACK界面的話,要在客戶程序中初始化BOA(基本對象配適器)。只要在向導中選上適當的框就可以做到了。 下步,用和寫其它CBuider應用程序相同的方法進行應用程序編寫。不過,當你使用定義在服務器應用中的對象的時候,不是直接和對象實例打交道,而是取得一個對CORBA對象的引用並使用它來工作。有兩種方法可以取得對服務器對象的引用,這和你用哪種綁定相關:

如果使用靜態綁定,你可以調用CORBA Object wizard(Edit|Use CORBA Object)。靜態綁定比動態快,並且提供編譯時類型檢查、代碼完整(code_completion)等好處。

然而,總有你要到運行時才知道想用的界面或對象的時候,這時就要用動態綁定了。動態綁定使用一個通用的CORBA對象,它用一種名為ANY的特殊CORBA類型將請求傳給服務器。

使用存根

存根類是在編譯IDL文件時自動生成的。他們定義在生成的客戶端文件裡,這些文件名字為xxx_c.cpp和xxx_c.hh。

注意:可以讓C++BUILDER只建立客戶文件(存根)而不要服務器文件,這要通過Project Options對話框的CORBA頁來設定。

當寫一個CORBA客戶端時,不必編輯生成的客戶端文件裡的代碼,相反,在用到時實例化存根類。這要通過選擇Edit|Use CORBA Object調出Use CORBA Object wizard。

在這個對象使用向導中,指明包含所需界面的IDL文件,並選擇要用的界面。如果只想綁定到特定名字的CORBA對象實例,可以可選的提供一個名字給CORBA對象。

Use CORBA Object wizard讓你從以下綁定機制中選擇:

如果客戶端程序是VCL可用型的窗口應用程序,可以在程序窗體(form)中創建一個屬性保存你的CORBA對象存根類的一個實例。你可以把這個屬性當作CORBA服務器對象的實例來用。

如果建立的是控制台應用程序,向導會在你的main()函數裡作為變量來示例存根類。相似的,它可以把存根類示例為WinMain()中的變量,如果是窗口應用程序的話。

不管是Windows還是Console應用,向導可以把一個屬性(property)加入到任何指定單元中的某個類中或起草一個含有一個代表存根實例屬性的新類。

不管用哪種機制,向導加入必要的頭文件並生成代碼,這些代碼綁定一個CORBA服務器對象的存根變量或屬性。例如,下邊的代碼在控制台程序的main()中示例了名為MyServerObj的服務器界面的存根。

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

注意:如果拷貝綁定代碼到程序的其它部分,要確保存根變量是局域變量或類的數據成員。不要使用全局存根變量,因為它們在orb變量釋放前不釋放他們的CORBA引用計數。如果非要用全局存根變量,務必在orb釋放之前將變量設為NULL以解除綁定。

如果你的客戶應用程序只包括生成的客戶單元(xxx_c),就不能用CORBA Object wizard綁定到服務器對象。相反要自己動手寫這些代碼。你也許想寫自己的綁定代碼以利用VisiBroker的綁定選項。(例如:可以指定特定的服務器,禁止CORBA連接丟失時的自動重綁定服務器特性,等等)。詳情見VisiBroker文檔。

使用動態請求界面(DII)

dynamic invocation itnerface(DII)允許客戶端應用調用服務器對象,而且不使用明確套接(marshal)界面調用的存根類。因為DII必須在客戶發送請求之前編碼所有類型信息及解碼服務器的信息,所以要比用存根類慢。

要在客戶端應用中使用DII,必須:

1、建立一個公用CORBA對象,它的作用類似於存根對象,除了其實現中不包含套接請求。必要提供對象的響應ID以說明哪個對象將收到DII請求:

CORBA::Object_var diiObj;
try
{
diiObj = orb->bind("IDL:ServerObj:1.0");
} catch (const CORBA::Exception& E)
{
// handle the bind exception.
}

2、接著,用這個公用CORBA對象為其代表對象的特定方法建立一個請求對象:

CORBA::Request_var req= diiObj->_request("methodName");

3、下面,加上該方法的所有參數。參數被加到類型為CORBA::NVList_ptr的請求(request)上。每個參數都是CORBA::Any類型的,Any類就似於BCB Variant。要求CORBA::Any類型是因為一個有名字值清單(CORBA::nvlIST)必須管理任何參數清單,其中可能包括任何類型的值。

CORBA::Any arg;
arg <<=(const char *)"argvalue";
CORBA::NVList_ptr arguments=req->arguments();
argmenets_>ad_value("arg1",arg,CORBA::ARG_IN);

4、現在調用請求:

req_>invok();

5、最後,檢查是否有錯並提取結果:

if(req->env()->exception())
//handle exeption
else
{
CORBA::Any_ptr pRetVal=req->result()->value();
CORBA::float val;
Any_ptr >>=val;
}

動態調用界面詳見VisiBroker Developer's Guide

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved