忍者ブログ

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

   

[PR]

×

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

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

おはようございます。
克兎です。

変わった夢を見ました。
本田 望結ちゃんが俺のになる夢です。

夢って現実の記憶が影響するとかいう説があるよね。
当然現実では本田 望結は俺の妹ではありません。
残念ですが。

拍手[0回]


つーことは別の説が有力ってことになってきます。
夢の世界はパラレルワールド説。
並行世界なんて無数にあるんだから。
パラレルワールドなんて言ったもん勝ちですよ。

つまり並行世界では本田 望結と俺はを分けた家族って事か。

いいじゃないか。

はい、前口上が徐々に長くなっていますが、
前回の続きをしましょう。

何故、初期のファイルサイズ分しか、データを取り扱えないのか、
これは、前回僕がアップしたソースに問題があります。
関数の設定の都合上、
読み込んだファイルサイズちょうどだけデータをマッピングするようになっています。

23780198.png

メモリ上にそのサイズ分がマッピングされるため、
初期に設定したサイズ(この場合ファイルサイズ)を超えるとオーバーフローしてしまうわけです。

d4c7b33d.png


こういう場合にどうすればいいか、
マッピングする前に、ファイルサイズを増長してやることで、ひとまず解決できます。


09512488.png

ファイルサイズを増長した状態で、マッピングしてやることで、大目にデータを保持できます。


fc3c2d44.png

で、ソース的にはどうすんのよ?

これは、既存の設定を変えるだけでできます。
CreateFileMapping関数を見てください。

2,ファイルをメモリにマッッピングする関数。

HANDLE CreateFileMapping(
HANDLE hFile, // ファイルのハンドル
LPSECURITY_ATTRIBUTES lpAttributes, // セキュリティ
DWORD flProtect, // 保護
DWORD dwMaximumSizeHigh, // サイズを表す上位 DWORD
DWORD dwMaximumSizeLow, // サイズを表す下位 DWORD
LPCTSTR lpName // オブジェクト名
);


第4引数、dwMaximumSizeHighは4GBを超えるデータを扱う場合でない限り0で結構です。
が、第5引数dwMaximumSizeLowは若干動きが変わります。
最低でもこれだけはマッピングするぞっていう値
を設定する個所です。

つまり、ここに適当な値を入れれば、その分だけマッピングされるわけです。
マッピングされた時点で、足りないサイズ分は、自動増長されるので、
上記方法には打って付けなわけです。

前回のソースを見てみます。

main.cpp

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



第5引数には0が設定されていますよね、
これは、ファイルサイズぴったりを確保するという意味です。

main.cpp

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



こうしてやれば、256バイト確保されるということになります。
 
ただし、
察しの良い方は気付かれてると思いますが、
この方法には欠点があります。

最初に確保する値を設定しなければならないため、
最終的に入力されるサイズがわかっていないといけない
ということです。

そうです、これまで
”メモリマップドファイルは文字列操作的に、データを操作する”
っぽくやってきましたが、
実は、可変長な文字列だと、期待した実行結果が得られにくい!
(読み込みのみなら、かなり役に立ちますが、)

ならば、メモリマップドファイルで、扱うのに向いているのは
どういったデータなのでしょうか?

むしろここからがメモリマップドファイルの真価と言えますが、
それはまた次回、
そ~れ~で~は~(*´∀`)ノ
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]

カレンダー

02 2024/03 04
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
31

テスト

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