[ C++で開発 ]
C++用オープンソースCORBAの一つMICOをインストールします。
MICOはVC++7.0以上が必要です。持っていないので省略。
Cygwinでビルドします。
work$ tar xzf mico-2.3.11.tar.gz work$ cd mico work$ ./configure : work$ make : work$ make install
time$ idl --c++-suffix cpp time.idl time$ ls time.cpp time.h time.idl time$
time$ g++ -c server.cpp time$ g++ -c time.cpp time$ g++ server.o time.o -L/usr/local/lib -lmico2.3.11 -o server time$
time$ g++ -c client.cpp time$ g++ -c time.cpp time$ g++ client.o time.o -L/usr/local/lib -lmico2.3.11 -o client time$
time$ ./server > ior
time$ ./client `cat ./ior` Time in Greenwich is 13:00:46 time$
// time.idl
struct TimeOfDay {
short hour;
short minute;
short second;
};
interface Time {
TimeOfDay get_gmt();
};
|
//server.h
#include "time.h"
class Time_impl : public virtual POA_Time
{
public:
virtual TimeOfDay get_gmt() throw (CORBA::SystemException);
};
|
// server.cpp
#include "server.h"
#include <iostream>
TimeOfDay Time_impl::get_gmt() throw (CORBA::SystemException)
{
time_t time_now = time(0);
struct tm* time_p = gmtime(&time_now);
TimeOfDay tod;
tod.hour = time_p->tm_hour;
tod.minute = time_p->tm_min;
tod.second = time_p->tm_sec;
return tod;
}
int main(int argc, char* argv[])
{
try {
CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
CORBA::Object_var obj = orb->resolve_initial_references("RootPOA");
PortableServer::POA_var poa = PortableServer::POA::_narrow(obj.in());
PortableServer::POAManager_var mgr = poa->the_POAManager();
mgr->activate();
Time_impl time_servant;
Time_var tm = time_servant._this();
CORBA::String_var str = orb->object_to_string(tm.in());
std::cout << str.in() << std::endl;
orb->run();
} catch (const CORBA::Exception& e) {
std::cerr << "Uncaught CORBA exception" << std::endl;
return 1;
}
return 0;
}
|
// client.cpp
#include <iostream>
#include <iomanip>
#include "time.h"
int main(int argc, char* argv[])
{
try {
if (argc != 2) {
std::cerr << "Usage: client IOR_string" << std::endl;
throw 0;
}
CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
CORBA::Object_var obj = orb->string_to_object(argv[1]);
if (CORBA::is_nil(obj.in())) {
std::cerr << "Nil Time reference" << std::endl;
throw 0;
}
Time_var tm = Time::_narrow(obj.in());
if (CORBA::is_nil(tm.in())) {
std::cerr << "Argument is not a Time reference" << std::endl;
throw 0;
}
TimeOfDay tod = tm->get_gmt();
std::cout << "Time in Greenwich is "
<< std::setw(2) << std::setfill('0') << tod.hour << ":"
<< std::setw(2) << std::setfill('0') << tod.minute << ":"
<< std::setw(2) << std::setfill('0') << tod.second << std::endl;
} catch (const CORBA::Exception& e) {
std::cerr << "Uncaught CORBA exception" << std::endl;
return 1;
}
return 0;
}
|
まず、リモートインタフェースおよびホームインタフェースからIDLファイルを生成します。
生成されたIDLファイルを使用するにあたって、以下の注意点が必要となります。
time$ idl -I. -I/usr/local/include/mico --c++-suffix cpp -DprimaryKey=primKey time.idl time$ ls time.cpp time.h time.idl time$