ここではコンポーネントをアクティブ化するためのプログラムについて紹介します.
まずは小手調べで,PeriodicConsoleOutコンポーネントのアクティブ化を行ってみましょう.
PeriodicConsoleOutコンポーネントを作成するためのプロジェクトに,あらたにComponentActivatorという空のWin32プロジェクトを追加します.
次に,プロジェクトのプロパティの変更が必要です.
*0.4.2では,「構成プロパティ」-「全般」を選択し,「継承プロジェクトプロパティシート」に「$(SolutionDir)rtm_config.vsprops;$(SolutionDir)user_config.vsprops」
と入力.その後,ほかのプロジェクトでRTC_Templateが出力したrtm_config.vspropsとuser_config.vspropsをソリューションのディレクトリにコピーすれば,VC++のディレクトリ設定無しに,インクルードファイル等へのPATHが通る.
まず,プリプロセッサの定義に,
USE_stub_in_nt_dll;WIN32;_DEBUG;_CONSOLE;__WIN32__;__x86__;_WIN32_WINNT=0x0400;__NT__;__OSVERSION__=4;_CRT_SECURE_NO_DEPRECATE
*ver. 0.4.2では,継承プロジェクトプロパティシートの設定さえ終わっていれば,
$(rtm_libd)と書くだけでよい.
と記入してください.

次に,リンカの設定で,入力に
ACEd.lib RTC041d.lib omniORB407_rtd.lib omniDynamic407_rtd.lib omnithread32_rtd.lib advapi32.lib ws2_32.lib mswsock.lib
を加えます.

これでプロジェクトの設定は終了です.
次にプロジェクトにCPPファイルを追加します.ここではファイル名はComponentActivator.cppとしましょう.
プログラムの流れは,
となります.一応,ComponentActivator.cppファイルの中身すべては以下の通りです.
#include <iostream>
#include <rtm/CorbaNaming.h>
#include <rtm/RTObject.h>
#include <rtm/CorbaConsumer.h>
#include <assert.h>
using namespace RTC;
int main(int argc, char** argv) {
//CORBA ORBオブジェクトを生成
CORBA::ORB_var corbaORB = CORBA::ORB_init(argc, argv);
//ネームサービスオブジェクト生成
CorbaNaming corbaNaming(corbaORB, "localhost:2809");
//ネームサーバーからPeriodicConsoleOutコンポーネントのインスタンスを検索
CorbaConsumer<RTObject> periodicConsoleOut0;
periodicConsoleOut0.setObject(corbaNaming.resolve("PeriodicConsoleOut0.rtc"));
//PeriodicConsoleOutコンポーネントのインスタンスをアクティブ化
ExecutionContextServiceList_var executionContextServiceList;
executionContextServiceList = periodicConsoleOut0->get_execution_context_services();
executionContextServiceList[0]->activate_component(RTObject::_duplicate(periodicConsoleOut0._ptr()));
//CORBA ORBオブジェクトの破壊
corbaORB->destroy();
return 0;
}
コンパイルするとたくさんwarningが出ます.何でなのかは今検討中.でもコンパイルは出来ます.
実行前にrtc.confファイルの変更が必要です.今回はnamingサービスの設定が必要になります.
RTCがネームサーバーに登録される際の名前付けの規則を変更します.新しいrtc.confに"naming.formats: %n.rtc"の行を追加します.これによって,PeriodicConsoleOutコンポーネントが作成された場合,名前はPeriodicConsoleOut0.rtcとなります.
この名前を使って,ネームサーバーからインスタンスを検索&取得するのです.
ネームサーバーを起動してから,PeriodicConsoleOutコンポーネントを起動してください.RtcLinkを使っているなら,ネームサーバーにPeriodicConsoleOut0.rtcというコンポーネントが登録されいてることがわかるでしょう.
次に,ComponentActivatorを実行すると,コンソールに文字列が出力されます.
いかがでしたか?簡単?難しい??
コンポーネントだけではプログラムは成立しませんから,コンポーネントをアクティブ化するプログラムは必要不可欠です.ただ,今のままではコンポーネントの真の意味が分からないことでしょう.
そこで次はコンポーネント間の通信方法について練習しましょう.
ココからですよ〜ついてきてますか??
ComponentActivator.zip (ver. 0.4.1)
ComponentActivator042.zip (ver. 0.4.2)