コンポーネントをアクティブ化するプログラム

ここではコンポーネントをアクティブ化するためのプログラムについて紹介します.

まずは小手調べで,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としましょう.

プログラムの流れは,

  1. CORBAオブジェクトを作成して,ネームサーバーを取得.
  2. ネームサーバーから起動しているコンポーネントの中からPeriodicConsoleOutコンポーネントのインスタンスを取得.
  3. PeriodicConsoleOutコンポーネントのインスタンスをアクティブ化.
  4. CORBAオブジェクトを破棄.

となります.一応,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の設定

実行前に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)


RTミドルウェア入門