やあやあ、克兎です。
しばらく記事書いてなかったネー。
いろいろあったヨー。
和田ちゃん、ごめんなさいヨー。
例えば一昨日は、
日本橋に行って
ロストドライバー買ってたヨー。
昨日は、ロストドライバーのベルトを
延長改造してたヨー。
日本橋にいったら、やたら人がいてびっくりしたヨー。
ストリートフェスタなんて知らなかったヨー。
[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の応用編です。
できるだけソースはわかりやすくしたつもりなので、勉強に使ってください。
ファイルはこちらPR
COMMENT