INtimeドキュメンタリトップへ

データのインターフェース

10月23日・・・オブジェクト型メールボックス

オブジェクト型メールボックスはINtime®オブジェクトのハンドル(RTHANDLE)を送受信します。

NT側データ表示プロセスに対して送信するデータをオブジェクト型メールボックスで送信することになりました。 オブジェクト型メールボックスの使用にはたくさんのトラブルがありました。

オブジェクト型メールボックスを使用して送受信するものはオブジェクト(RTHANDLE)です。RTHANDLEを受信した時点で、そのRTHANDLEが正しいRTHANDLEなのかを判別し、そのハンドルをマップすることにより、データを参照するのですが・・・。


失敗その1:

メモリオブジェクトを生成しなかった 送信データは、データ型メールボックスと同様、WORD×8(CH分)の16BYTEです。

オブジェクト型メールボックスについてまったく知らない私は

   WORD	*wSndData;
   /*	NT側に送信するデータを共有メモリにデータを格納する	*/
   memcpy(wSndData,aData,sizeof(aData));
   /*	共有メモリハンドラをNT側に送信する	*/
   SendRtHandle(strInfo.hdataMbox,wSndData,NULL_RTHANDLE);
のようにオブジェクトメールボックスに対してデータを渡したり、 RTHANDLE hdataobj; strInfo.sendData = (WORD*)MapRtSharedMemory(hdataobj); /* 共有メモリにデータを格納する */ /* NT側との通信の為、共有メモリにデータを格納する。 */ memcpy(strInfo.sendData,ADataVAL,sizeof(ADataVAL)); /* 共有メモリハンドラをNT側に送信する */ SendRtHandle(strInfo.hNtResvMbox,strInfo.hDataObj,NULL_RTHANDLE);
ハンドルを宣言し、無理矢理マップしてデータを格納し、送信するなど・・・。
ハンドルはあくまでもオブジェクトに対して与えられるものであり、勝手にデータを作って、
「それをハンドルです!!」とすることができないとわかりました。
ここでのオブジェクトとはメモリ(共有メモリ)のことです。

正しい手続きは・・・:
1.メモリを確保する。(AllocateRtMemory)
2.確保したメモリに対し、オブジェクトハンドルを生成する。(CreateRtMemoryHandle)
3.生成したメモリハンドルをマップし、データを書き込む。(MapRtSharedMemory)
4.ハンドルを送信する。(SendRtHandle)
となります

WORD*	wSendDt;      書き込みデータ
WORD*	wRecvDt;      読み込みデータ
RTHANDLE hObjHandle;  送受信信オブジェクトハンドル
wSendDt = (WORD *)AllocateRtMemory(4096); //メモリの割り当て ●hObjHandle = CreateRtMemoryHandle( wSendDt, 4096 ); //メモリハンドルの生成 ●wRecvDt=(WORD*)MapRtSharedMemory(hObjHandlle); //メモリオブジェクトのマップ ●SendRtHandle( strInfo.hNtResvMbox, hObjHandle, NULL_RTHANDLE )//オブジェクトの送信

失敗その2:

オブジェクトメールボックスとデータメールボックスのシステムコールの違いに気付かなかった。
データ型メールボックスと、オブジェクト型メールボックスの生成においてはシステムコールには違いがなく、パラメータの違いのみです:

CreateRtMailbox(DATA_MAILBOX | FIFO_QUEUING).... データ型メールボックス生成
CreateRtMailbox(OBJECT_MAILBOX | FIFO_QUEUING).. オブジェクト型メールボックス生成
しかし、データの送信、オブジェクトの送信はそれぞれシステムコールが異なります:
SendRtData()............................ データ型メールボックスに送信
ReceiveRtData().......................... データ型メールボックスから受信
SendRtObject()........................... オブジェクト型メールボックスに送信
ReceiveRtObject()......................... オブジェクト型メールボックスから受信
Windows側とやり取りをする場合、共有メモリサイズはWindowsのページサイズ(4Kbyte:4096バイト)の倍数にする必要がありましたが、今回の共有メモリサイズが小さいもので、AllocateRtMemory( sizeof(WORD) * 8 )と指定していました。  
1.メモリを確保する。(AllocateRtMemory)
2.確保したメモリに対し、オブジェクトハンドルを生成する。(CreateRtMemoryHandle)
3.生成したメモリハンドルをマップし、データを書き込む。(MapRtSharedMemory)
4.ハンドルを送信する。(SendRtHandle)

となります
WORD*	wSendDt;    書き込みデータ
WORD*	wRecvDt;    読み込みデータ
RTHANDLE hObjHandle;送受信信オブジェクトハンドル
wSendDt = (WORD *)AllocateRtMemory(4096); //メモリの割り当て ●hObjHandle = CreateRtMemoryHandle( wSendDt, 4096 ); //メモリハンドルの生成 ●wRecvDt=(WORD*)MapRtSharedMemory(hObjHandlle); //メモリオブジェクトのマップ ●SendRtHandle( strInfo.hNtResvMbox, hObjHandle, NULL_RTHANDLE )//オブジェクトの送信

失敗その3:

割り当てるメモリサイズAllocateRtMemoryで確保するメモリサイズ。

Windows側とやり取りをする場合、共有メモリサイズはWindowsのページサイズ(4Kbyte:4096バイト)の倍数にする必要がありましたが、今回の共有メモリサイズが小さいもので、AllocateRtMemory( sizeof(WORD) * 8 )と指定していました。


※TenAsys®, INtime®, eVM® and iRMX® are registered trademarks in USA of the TenAsys Corporation.