忍者ブログ

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

   

[PR]

×

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

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

やあやあ、克兎です。

しばらく記事書いてなかったネー。
いろいろあったヨー。
和田ちゃん、ごめんなさいヨー。

例えば一昨日は、日本橋に行ってロストドライバー買ってたヨー。

昨日は、ロストドライバーのベルトを延長改造してたヨー。

日本橋にいったら、やたら人がいてびっくりしたヨー。

ストリートフェスタなんて知らなかったヨー。

拍手[0回]


おもわず、知識王に連絡いれちゃったヨー。

要するに趣味を堪能してました。

さて、メモリマップドファイルで、テクスチャの読み込み、ですよね。

使い道ない気がするんだよなぁ。
最終的にはメモリに読み込むわけですし。

今回は、Direct3Dがメインです。
もちろんDirectXの機能で読み込みますよ!

今回出てくる関数は、こちら。(MSDNのコピペ)

HRESULT D3DXCreateTextureFromFileInMemory(
  LPDIRECT3DDEVICE9 pDevice,
  LPCVOID pSrcData,
  UINT SrcDataSize,
  LPDIRECT3DTEXTURE9 * ppTexture
);


3Dゲームにはテクスチャは必要不可欠ですよね。
こちらの関数は、メモリに展開されたデータからテクスチャを生成する関数です。

つまり、マッピングオブジェクトやハッシュメモリに圧縮ファイルを展開した時、
とかに使えるわけです。

ここまでの記事を読んでる方には、
すでに使い方に察しはついてるかと思います。

じゃ、ソースを書いていきますよ。

main.cpp

//テクスチャロード関数===================================
void LoadText( LPDIRECT3DTEXTURE9 *lpTex , char fname[] , int W , int H , D3DCOLOR Color )
{
 //ファイルマッピングの流れ*******************************************************************************

 //Section1:ファイルを開く
 HANDLE hFile = CreateFile( fname , GENERIC_READ | GENERIC_WRITE , 0 , 0 , OPEN_ALWAYS , 0 , 0 );
 if( hFile == INVALID_HANDLE_VALUE )
 {
  printf( "ファイルオープン失敗したしー" ); //エラー

  *lpTex = NULL;
  return;
 }

 //ファイルのサイズを調べる
 UINT Size = GetFileSize( hFile , NULL );

 //Section2:メモリ空間上にマッピング
 HANDLE hMap = CreateFileMapping( hFile , 0 , PAGE_READWRITE , 0 , 0 , "FileMapping_katuusagi" );
 if( hMap <= 0 )
 {
  printf( "ファイルをマッピングできねーしー." ); //エラー
  CloseHandle( hFile ); //せっかく開いたけどクローズせざるを得ない(´;ω;`)

  *lpTex = NULL;
  return;
 }

 //Section3:マッピングしたデータへのポインタを取得
 LPVOID mapView = MapViewOfFile( hMap , FILE_MAP_ALL_ACCESS , 0 , 0 , 0 );
 if( mapView == NULL )
 {
  CloseHandle( hMap ); //せっかくマップしたけどクローズせざるを得ない(´;ω;`)
  CloseHandle( hFile ); //せっかく開いたけどクローズせざるを得ない(´;ω;`)
  printf( "マップビューが取得できねーしー" ) ; //エラー

  *lpTex = NULL;
  return;
 }
 

 //ファイルの操作****************************************************************************************
 if( W == 0 )W = D3DX_DEFAULT;
 if( H == 0 )H = D3DX_DEFAULT;

 //メモリからテクスチャを読み込む
 if( FAILED( D3DXCreateTextureFromFileInMemory( lpD3DDevice , mapView , Size , lpTex ) ) ){

  *lpTex = NULL;
  return;
 }

 //ファイルのクローズの流れ*********************************************************************************
 
 //Section1:アンマップ( マップビューの後始末 )

 if( !UnmapViewOfFile( mapView ) )
 {
  printf( "アンマップできねーしー" ) ; //エラー
  *lpTex = NULL;
  return;
 }

 //Section2:マッピングオブジェクトのクローズ
 CloseHandle( hMap );

 //Section3:ファイルのクローズ
 CloseHandle( hFile );

}


メモリからテクスチャを読み込むには、
ファイルサイズを知っておく必要があります。
なので、GetFileSize関数でファイルサイズを調べておきましょう。

あとはD3DXCreateTextureFromFileInMemory関数の
第2引数に、マップビューを、
第3引数に、サイズを設定すれば、
第4引数に、テクスチャのポインタが返ります。

あとは、マッピングオブジェクトを後始末するだけですね。

ここまでやってみるとわかりますが、
このロード関数は、明らかに過包装です。

まるで、四次元ポケットの中にスペアポケットを入れてるドラえもんです。
買い物するときに、金庫を持ち歩いて、金庫を開けたらマトリョーシカの如く、財布が入っているような状態です。
コアメダルを腕の中にしまえるのに、わざわざ、メダルケースを持ち歩くアンクです。しかも結局タトバです。

なので、滅多に使うことはないかと思われます。

ただ、この関数は覚えておいて損はないと思います。

ソースはこちら

さて、メモリマップドファイル編はこれで終わりです。
ほかにもできることはありますが、
もっといろいろ知りたい方は、ラボに来てください。

教えられることは少ないかもしれませんが、すこしでも役に立てればと思っています。

今後もブログの方ではAPI講座を開いていきますのでよろしくお願いします。

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


応用編:
メモリマップドファイルのプロセス間通信を利用した、一人チャットを作りました。
Part5の応用編です。


ca5680ab.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]