ここではコンポーネントをアクティブ化するためのプログラムについて紹介します.
まずは小手調べで,PeriodicConsoleOutコンポーネントのアクティブ化を行ってみましょう.
プロジェクトの追加
PeriodicConsoleOutコンポーネントを作成するためのプロジェクトに,あらたにRTCActivateというWin32コンソールプロジェクトを追加します.
プロジェクトのプロパティの設定
次に,プロジェクトのプロパティの変更が必要です.
継承プロパティシートの設定
「構成プロパティ」-「全般」を選択し,「継承プロジェクトプロパティシート」に
$(ProjectDir)rtm_config.vsprops;$(ProjectDir)user_config.vsprops
と入力.その後,ほかのプロジェクトでRTC Builderが出力したrtm_config.vspropsとuser_config.vspropsをプロジェクト(○○.proj)のあるフォルダにコピーすれば,VC++のディレクトリ設定無しに,インクルードファイル等へのPATHが通ります.
プリプロセッサ定義
RELEASEビルド側
プリプロセッサの定義に,
USE_stub_in_nt_dll;WIN32;NDEBUG;_CONSOLE;__WIN32__;__x86__;_WIN32_WINNT=0×0500;
__NT__;__OSVERSION__=4;_CRT_SECURE_NO_DEPRECATE(改行しません)
とします.
DEBUGビルド側
プリプロセッサの定義に,
USE_stub_in_nt_dll;WIN32;_DEBUG;_CONSOLE;__WIN32__;__x86__;_WIN32_WINNT=0×0500;
__NT__;__OSVERSION__=4;_CRT_SECURE_NO_DEPRECATE(改行しません)
と記入してください.
リンカの設定
DEBUGビルド側
次に,リンカの設定で,入力に
$(rtm_libd) $(coil_libd)
を加えます.
RELSEASEビルド側
次に,リンカの設定で,入力に
$(rtm_lib) $(coil_lib)
を加えます.
これでプロジェクトの設定は終了です.
プログラム
ソリューションを作った時点で,以下のファイルが出来ています.
- RTCActivate.cpp
- stdafx.h
- stdafx.cpp
- targetver.h
stdafx.h
これはプリコンパイルヘッダーの設定がされていて,変更が少ないヘッダーファイルのみをコンパイル単位として保存しておき,再コンパイル時に,いちいち再コンパイルされずに作業を効率化するのが目的です.この部分にRTC.hやManager.hなどのコンパイルに時間がかかるファイルを置いておくと,作業がはかどります.
#pragma once #include "targetver.h" #include #include #include #include #include #include #include
RTCActivate.cpp
プログラムの流れは,
- CORBAオブジェクトを作成して,ネームサーバーを取得.
- ネームサーバーから起動しているコンポーネントの中からPeriodicConsoleOutコンポーネントのインスタンスを取得.
- PeriodicConsoleOutコンポーネントのインスタンスをアクティブ化.
- CORBAオブジェクトを破棄.
となります.一応,RTCActivate.cppファイルの中身すべては以下の通りです.
// RTCActivate.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//
#include "stdafx.h"
using namespace RTC;
int _tmain(int argc, _TCHAR* argv[])
{
//CORBA ORBオブジェクトを生成
CORBA::ORB_var corbaORB = CORBA::ORB_init(argc, (char**)argv);
//ネームサービスオブジェクト生成
CorbaNaming corbaNaming(corbaORB, "localhost:2809");
//ネームサーバーからPeriodicConsoleOutコンポーネントのインスタンスを検索
CorbaConsumer periodicConsoleOut0;
CORBA::Object_ptr object = corbaNaming.resolve("agni.host_cxt/PeriodicConsoleOut0.rtc");
periodicConsoleOut0.setObject(object);
//PeriodicConsoleOutコンポーネントのインスタンスをアクティブ化
ExecutionContextList_var ExecutionContextList = periodicConsoleOut0->get_owned_contexts();
ExecutionContextList[0]->activate_component(RTObject::_duplicate(periodicConsoleOut0._ptr()));
//CORBA ORBオブジェクトの破壊
corbaORB->destroy();
return 0;
}
皆さんのプロジェクトごとの変更点
ポイントは数か所ありますが,ネームサーバーのIPアドレスもしくはURLは当たり前ですね.
山場はCorbaConsumerオブジェクトのresolveメソッドです.このCorbaConsumerオブジェクト生成時に指定したIPアドレス,もしくはURLのネームサーバ上の名前を検索して,目的のRTCを見つけます.RTCの名前の付け方は結構複雑です.
デフォルトでは,
○○.host_cxt/××0.rtc
となっており,○○にはRTCを実行しているホストPCの名前,××にはRTCの名前が入ります.僕の場合,実行しているノートPCの名前がagniなので,上図のような指定になっています.
名前の付け方・・・の変え方.rtc.conf
RTCの名前の付け方は,デフォルトではそのRTCが読み込むrtc.confで決まります.またバージョン1.0ではManagerがCORBAオブジェクトになったので,名前の付け方の自由度が格段に上がりましたが,これについては後述で.
とにかくrtc.confに次のように書くと名前つけルールが変わります.
naming.formats: %h.host_cxt/%n.rtc
%hはPCのホスト名,%nはRTC名です.
PC一台でやっている時は,
%n.rtc
くらいシンプルでもOKです.こうなると,○○0.rtcのような名前になります.複数のPCでRTCを実行している場合は,%hを付けてホストごとに名前がわかれるようにします.%pを入れるとプロセスIDが入ります.あまりお勧めしませんが.
コンパイル
コンパイルするとたくさんwarningが出ます.何でなのかは今検討中.でもコンパイルは出来ます.
実行
ネームサーバーを起動してから,PeriodicConsoleOutコンポーネントを起動してください.RT
System Editorを使っているなら,ネームサーバーにPeriodicConsoleOut0.rtcというコンポーネントが登録されていることがわかるでしょう.
次に,RTCActivateを実行すると,自動的にアクティベートされてコンソールに文字列が出力されます.
まとめ
いかがでしたか?簡単?難しい??
コンポーネントだけではプログラムは成立しませんから,コンポーネントをアクティブ化するプログラムは必要不可欠です.
RTCActivate
