克兎です。
ホワイトデーのお返しを忘れてたことが原因で、
大変みじめな思いをしました。
自業自得ですよそうですよ。
いいもんねいいもんね、ダッシュでコンビニ行ったもんね。
ヘッヘーンだ![0回]
さてさて、
更新率が下がってきたのを確認しつつ
前回の続きです。
(そろそろ、
知識王かっちゃんの出番だと思うよ。)
今回は、
プロセス間通信、について解説します。
メモリマップドファイルはファイルをメモリ上にマッピングするという特性上、
共有メモリを生み出します。
この共有メモリは他プロセス(インスタンス)からのアクセスを受け付けることができます。
じゃあ、2つのプロセスから共通のファイルを使って
マッピングオブジェクトを作ればいいのか!
すいません、違います。
いやできるんだけど、スマートなやり方ではありません。
ここでは実態をもったファイルではなく
ページファイルを使います。
ページファイルとは、使われていないメモリ領域を保持するのに使われているファイルです。
こいつは、プログラム起動時に自動生成されるので、
CreateFile関数を
使う必要はありません。
じゃあ、どうやってマッピングオブジェクトを作るのか、
まずはソースから。
main.cpp
//ファイルマッピングの流れ*******************************************************************************
HANDLE hMap; //マッピングオブジェクトのハンドル
char* mapView; //マッピングオブジェクトへのポインタ
//Section1:メモリ空間上にマッピング
hMap = CreateFileMapping( ( HANDLE )0xFFFFFFFF , 0 , PAGE_READWRITE , 0 , 1024 , "ShareMemmory_katuusagi" );
if( hMap <= 0 )
{
printf( "ファイルをマッピングできねーしー." ); //エラー
return 1;
}
//Section2:マッピングしたデータへのポインタを取得
mapView = ( char * )MapViewOfFile( hMap , FILE_MAP_ALL_ACCESS , 0 , 0 , 0 );
if( mapView == NULL )
{
CloseHandle( hMap ); //せっかくマップしたけどクローズせざるを得ない(´;ω;`)
printf( "マップビューが取得できねーしー" ) ; //エラー
return 1;
}
|
CreateFileMapping関数の第1引数を見てください。
( HANDLE )0xFFFFFFFFが指定されていますね。
これを引数として与えることで、
自動的にページファイルのマッピングオブジェクトが作成されます。
これを指定した場合、
Part3でも説明した、第5引数に、
0を与えることができなくなります。
(実体がないから当然です。)
ページファイルは、
第6引数によって選出されます。
共通のページファイルを指定したい場合は、ここに、
同じ文字列を与えなければなりません。
main.cpp
//ファイルの操作****************************************************************************************
//受信側
if( *mapView ){
printf( "共有メモリ内のデータ:\n%s\n\n" , mapView ); //ファイルの表示
}
//送信側
else{
printf( "データを入力してね:\n" ); //
scanf( "%s" , mapView ); //ここだけでファイルが書き変えられる
}
printf( "ウェイト中:\n" ); //ファイルの表示
getch();
|
送信側と受信側で処理を変えています。
共有メモリにデータが入力されていた場合、
データを出力し、キー入力ウェイトをかませる。
共有メモリに何も入力されていない場合、
データを入力させ、キー入力ウェイトをかませる。
という内容です。
実行結果としてはこうなります。
もっと通信っぽい内容がしたかったけど、
入力待ちとかいろいろ面倒だった。
今回はわかりやすく済ませるためにこういう内容にしました。
ソースはこちら
次回はメモリマップドファイルでテクスチャの読み込みを行ってみたいんだけど、
まだやった事ないからやってから書きます。
もうちょい凝ったプロセス間通信のソースも、後々アップするかもしれません。
でも普通に作れるんじゃね?
いや、知らんけど。
そ~れ~で~は~(*´∀`)ノ
PR
COMMENT