メモリマップドファイルについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
シエル

メモリマップドファイルについて

#1

投稿記事 by シエル » 15年前

お世話になります。

昨日、自作のアーカイバとその解凍ツールが完成しました。
そのアーカイバを使って、今作成しているゲームの外部データをアーカイブ化しました。

そのアーカイブデータを読み込んで、今までどおり画像や音声が表示できるかどうか試しているのですが、
読み込む方法として、メモリマップドファイルの技術を使って読み込もうとしています。

一応、マッピングオブジェクトを作成するところまでは上手く言ったんですが、
MapViewOfFile関数で、メモリをマップしようとしたときに、正しくそのポインタが取得できずに困っています。
MapViewOfFile関数の使い方は下記のように使用しているのですが、何か間違っているでしょうか?

char *p;
HANDLE mh,fh;
int point;
int size;

fh=CreateFile()//省略。ここでアーカイブファイルのハンドルを取得

mh=CreateFileMapping()//省略。マッピングオブジェクト作成

point=独自関数()//ここで、アーカイブファイル内の読み込みたいデータの位置(バイト)を取得

size=独自関数()//ここで、アーカイブファイル内の読み込みたいデータのサイズを取得

p=(char *)MapViewOfFile(mh,FILE_MAP_READ,0,point,size);


個人的にはMapViewOfFileの第3、4、5引数が怪しいと思っています。

どなたか分かる方、ご教授お願い致します。


追記:
3,4,5の引数を全て0にして、ファイル全体をマッピングすると、ポインタは取得できます。
つまり、アーカイブファイル内の指定の位置のポインタを取得しようとするとエラーになっているようです。 画像

toyo

Re:メモリマップドファイルについて

#2

投稿記事 by toyo » 15年前

#include <windows.h>
#include <stdio.h>

int main (void)
{
SYSTEM_INFO SystemInfo;
GetSystemInfo(&SystemInfo);
printf("%x", SystemInfo.dwAllocationGranularity);
return 0;
}

MapViewOfFile( )関数の第3、4引数(オフセット)は↑で得られるdwAllocationGranularityの倍数しか指定できないようです
バイト単位での指定は出来ないようです
自分の環境でやった結果は0x10000でした
普通にfopenとfseekではどうでしょう

シエル

Re:メモリマップドファイルについて

#3

投稿記事 by シエル » 15年前

>MapViewOfFile( )関数の第3、4引数(オフセット)は↑で得られるdwAllocationGranularityの倍数しか指定できないようです。

ということは、読み込みたい位置がdwAllocationGranularityの倍数でない時点でもうエラーが
出てしまうってことですよね。。。
じゃあ、この関数はアーカイブファイルを読み込むようなときには向いていないようですね。

ファイルをメモリのように扱えて、ファイルから読むからメモリを消費しない、かつメモリの動的確保も
いらないようだったので、この関数を見つけた当初は良い関数だなと思ってたんですけどね。
まあ、ちょっと勉強がてらに使ってみたいってのもあったので、勉強になりました!

なので、toyoさんの言うとおり、メモリを動的確保して、fseekなどで読み込んでいきたいと思います。

toyoさんありがとうございました!

シエル

Re:メモリマップドファイルについて

#4

投稿記事 by シエル » 15年前

メモリマップドファイルを使った解決法が見つかりましたので、
今後の参考とするために、一応書き込んでおきます。

たしかにMapViewOfFileのオフセット位置はSYSTEM_INFO構造体のdwAllocationGranularityの倍数しか指定できません。

その解決方法として、アーカイブファイル全体をマッピングしてから、ポインタを移動してやるということです。
全体をマッピングして、その先頭のポインタを取得し、そこから指定したバイトだけポインタを
移動してやれば、移動したい位置に移動できます。
この時はMapViewOfFileの第3,4引数のオフセットを使用していないので、
先ほどの倍数に縛られることはありません。

全体をマッピングしたら、それだけメモリ食うじゃないかと思いますが、
マッピングしているだけですので、メインメモリは消費しないので問題ありません。

以上。

※スレ上がったらすみません。。。 画像

閉鎖

“C言語何でも質問掲示板” へ戻る