こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

MapViewOfFileについて教えて下さい

C言語の初心者ですが、ファイルマッピングについて教えて頂きたいことがあります。

あるファイルをMapViewOfFileを使用し、複数タスクの共有メモリとして使用中に、
クローズせずに再マッピング(?)みたいなことはできないでしょうか?

例えば、マッピングするAというファイルの内容が、変数A=0、変数B=0、変数C=0、としてOpenFileMapping(FILE_MAP_ALL_ACCESS)されている。
次に、Bというファイルの内容が、Aファイルと変数名は変わらずで、
変数A=1、変数B=1、変数C=1、とします。
ここでAファイルをクローズ(他タスクが参照するかもしれないので)せずに、
AファイルをBファイルの内容にしたいということなのです。
こんなことは、やはりできないのでしょうか?
もちろん、Aファイルがマッピングされているので、直接Aを変更すれば良いのですが、
ファイル内容が膨大なため、なんとか再マッピング(?)できればと思ったのです。

OSはWindows2000で、VC6.0になります。

わかりにくい文章で申し訳ございませんが、よろしくお願いします。

投稿日時 - 2005-10-11 02:06:35

QNo.1705798

困ってます

質問者が選んだベストアンサー

>直接Aを変更すれば良いのですが、ファイル内容が膨大なため

膨大というのはどの程度ですか?
数MBくらいなら、Bファイルを読み込んでおいて、memcpy等でコピーするだけですよね。

投稿日時 - 2005-10-11 08:42:08

補足

回答ありがとうございます。
ファイルのサイズは、約14MBです。膨大というのは大げさでした。すみません。
ファイルを読み込んで変更する以外は無理なのでしょうか?

投稿日時 - 2005-10-11 09:20:53

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

#1です。

>ファイルを読み込んで変更する以外は無理なのでしょうか?

最初の読み込みはBファイルを使い、その後はAファイルを使うようなマッピングが出来なければならないですが、そういう事は出来ません。
VirtualAlloc、AllocateUserPhysicalPages等、SEHを使用して自前で作れないかとも思いましたが、MSDNを読む限りでは、同一ページをプロセス間で共用できそうな気がしませんし、それにSEHを使うなんてマニアックすぎですよね。

MapViewOfFileにFILE_MAP_COPYを指定してAファイルが変更されないようにしても、Win2000だと共有メモリにはならないので、この方法も駄目です。

共有メモリが初期化される事がある以上、なんらかの排他制御と各タスクが再起動するような機能が必要だと想像できます。
再起動には時間がかかる。と思うしか無いと思います。

投稿日時 - 2005-10-11 16:27:15

お礼

遅れまして申し訳ございません。
2度に渡り解答して頂きありがとうございました。
結局、inthefloiさんの言う通りファイル読み込みmemcpyすることにしました。

投稿日時 - 2005-10-16 02:33:38

あなたにオススメの質問