Borland(R) Enterprise Server VisiBroker(R) デベロッパーズガイド
DII Requestオブジェクトに取り込む必要がある情報ソースの一つは,IRです(「16. インタフェースリポジトリの使用」参照)。次に示すのは,IRを使用してオペレーションのパラメタを取得する場合の例です。この例は,実際のDIIアプリケーションでは一般的ではありませんが,リモートオブジェクトの型(Account)とそのメソッドの一つの名前(balance)を組み込み情報として持っています。実際のDIIアプリケーションでは,その情報をソースの外部,例えばユーザから取得します。
// acctdii_ir.C // This example illustrates IR and DII #include <iostream.h> #include "corba.h" int main(int argc, char* const* argv) { CORBA::ORB_ptr orb; CORBA::Object_var account; CORBA::NamedValue_var result; CORBA::Any_ptr resultAny; CORBA::Request_var req; CORBA::NVList_var operation_list; CORBA::Any customer; CORBA::Float acct_balance; try { // use argv[1] as the account name, or a default. CORBA::String_var name; if (argc == 2) name = (const char *) argv[1]; else name = (const char *) "Default Name"; try { // Initialize the ORB. orb = CORBA::ORB_init(argc, argv); } catch(const CORBA::Exception& excep) { cout << "Failure during ORB_init" << endl; cout << excep << endl; exit(1); } cout << "ORB_init succeeded" << endl; // Unlike traditional binds, this bind is called off of "orb" // and returns a generic object pointer based // on the interface name try { account = orb->bind("IDL:Account:1.0"); } catch(const CORBA::Exception& excep) { cout << "Error binding to account" << endl; cout << excep << endl; exit(2); } cout << "Bound to account object" << endl; // Obtain Operation Description for the "balance" method of // the Account try { CORBA::InterfaceDef_var intf = account->_get_interface(); if (intf == CORBA::InterfaceDef::_nil()) { cout << "Account returned a nil interface definition." << endl; cout << "Be sure an Interface Repository is running and" << endl; cout << "properly loaded" << endl; exit(3); } CORBA::Contained_var oper_container = intf->lookup("balance"); CORBA::OperationDef_var oper_def = CORBA::OperationDef::_narrow(oper_container); orb->create_operation_list( oper_def, operation_list.out()); } catch(const CORBA::Exception& excep) { cout << "Error while obtaining operation list" << endl; cout << excep << endl; exit(4); } // Create request that will be sent to the account object try { // Create placeholder for result orb->create_named_value(result.out()); resultAny = result->value(); resultAny->replace( CORBA::_tc_float, &result); // Set the argument value within the operation_list CORBA::NamedValue_ptr arg = operation_list->item(0); CORBA::Any_ptr anyArg = arg->value(); *anyArg <<= (const char *) name; // Create the request account->_create_request(CORBA::Context::_nil(), "balance", operation_list, result, req.out(), 0); } catch(const CORBA::Exception& excep) { cout << "Error while creating request" << endl; cout << excep << endl; exit(5); } // Execute the request try { req->invoke(); CORBA::Environment_ptr env = req->env(); if ( env->exception() ) { cout << "Exception occurred" << endl; cout << *(env->exception()) << endl; acct_balance = 0; } else { // Get the return value; acct_balance = *(CORBA::Float *)resultAny->value(); } } catch(const CORBA::Exception& excep) { cout << "Error while invoking request" << endl; cout << excep << endl; exit(6); } // Print out the results cout << "The balance in " << name << "'s account is $"; cout << acct_balance << "." << endl; } catch ( const CORBA::Exception& excep ) { cout << "Error occurred" << endl; cout << excep << endl; }
All Rights Reserved. Copyright (C) 2008, Hitachi, Ltd.
COPYRIGHT (C) 1992-2004 Borland Software Corporation. All rights reserved.