ysuga.net

This page is my hobby page! Robots, Inline skates, Rugby, and more!!

RTCをActivate,Deactivateするプログラムの作り方

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

まずは小手調べで,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(改行しません)

と記入してください.

PreProcessor Definition

PreProcessor Definition

リンカの設定

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

プログラムの流れは,

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

Get Adobe Flash playerPlugin by wpburn.com wordpress themes