忍者ブログ

神戸電子専門学校ゲームソフト学科の生徒が運営するGESのブログです。

   

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

WindowsAPI講座【メモリマップドファイル編】 Part5

克兎です。
ホワイトデーのお返しを忘れてたことが原因で、
大変みじめな思いをしました。

自業自得ですよそうですよ。

いいもんねいいもんね、ダッシュでコンビニ行ったもんね。
ヘッヘーンだ!

拍手[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();



送信側と受信側で処理を変えています。

共有メモリにデータが入力されていた場合
データを出力し、キー入力ウェイトをかませる。

共有メモリに何も入力されていない場合、
データを入力させ、キー入力ウェイトをかませる。

という内容です。

実行結果としてはこうなります。

7a2c084d.PNG


もっと通信っぽい内容がしたかったけど、
入力待ちとかいろいろ面倒だった。
今回はわかりやすく済ませるためにこういう内容にしました。

ソースはこちら
 
次回はメモリマップドファイルでテクスチャの読み込みを行ってみたいんだけど、
まだやった事ないからやってから書きます。

もうちょい凝ったプロセス間通信のソースも、後々アップするかもしれません。

でも普通に作れるんじゃね?
いや、知らんけど。

そ~れ~で~は~(*´∀`)ノ
PR

COMMENT

NAME
TITLE
MAIL(非公開)
URL
EMOJI
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
PASS(コメント編集に必須です)
SECRET
管理人のみ閲覧できます

ブログ内検索

最新コメント

[01/29 人面犬]
[10/01 8ch]
[09/12 uncle]
[09/10 某卒業生]
[06/07 uncle]

カレンダー

10 2024/11 12
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

テスト

Copyright ©  -- GESブログ --  All Rights Reserved
Design by CriCri / Photo by Geralt / powered by NINJA TOOLS / 忍者ブログ / [PR]