ファイルマッピングのサイズ変更

解決


ki  2004-02-13 22:46:50  No: 53165

共有メモリを使用して、プロセス間通信を行っています。
CreateFileMapping関数を使用して、MapViewOfFile関数にて
共有メモリを参照しています。
そこで、ファイルマッピングのサイズが4096バイト以上だとMapViewOfFile関数が
エラー復帰して、共有メモリの参照ができません。
(ファイルマッピングのサイズは、1MBを扱いたい)

ファイルマッピングのサイズが4096バイト以上で、共有メモリが参照できる
方法をどなたかご存知内でしょうか?

CreateFileMapping関数を使用しない方法もありましたら
お願いします。

ご教授お願いします。

環境
OS:Windows2000 SP4
VC++6.0
メモリ:256MB


YuO  2004-02-13 23:23:59  No: 53166

> そこで、ファイルマッピングのサイズが4096バイト以上だとMapViewOfFile関数が
> エラー復帰して、共有メモリの参照ができません。
> (ファイルマッピングのサイズは、1MBを扱いたい)

システムは,エラーの原因が何だと言っているのですか?
1Mバイト程度のマッピングは十分可能だと思いますが。


ki  2004-02-13 23:50:12  No: 53167

エラー内容は、以下の通りです。
「エラーコードは、5アクセスは拒否されました。」

私がCreateFileMapping関数、MapViewOfFile関数を使用した例を以下に
書きます。

#define MAPNAME "MAPFILE"
#define BUFSIZE 102400

typedef struct _StMem{
  char buf1[BUFSIZE];
  char buf2[BUFSIZE];
  char buf3[BUFSIZE];
  char buf4[BUFSIZE];
} StMem;

if( (hMapFile = CreateFileMapping( INVALID_HANDLE_VALUE, NULL,PAGE_READWRITE, 0, sizeof( StMem ), MAPNAME ){
   return GetLastError();
}

if( (mapfile = (StMem *)MapViewOfFile( hMapFile, FILE_MAP_ALL_ACCESS, 
                                  0, 0, sizeof( StMem ) )) == NULL ){
   return GetLastError();
}

MapViewOfFile関数より、エラー復帰する(エラーコード:5)


isshi  2004-02-14 06:49:11  No: 53168

共有メモリを使う全てのプロセスで、BUFSIZE は一致していますか?


ki  2004-02-14 07:45:59  No: 53169

確認したところ、BUFSIZEは一致してしました。
アクセス拒否なので、セキュリティ関連だと思い、
SECURITY_ATTRIBUTES構造体について、設定が必要かなと
思います。


isshi  2004-02-14 08:11:04  No: 53170

>確認したところ、BUFSIZEは一致してしました。
そうですか。
じつはkiさんが提示したコードをそのままコピーして試したところ
まったく問題なく動作しました。(WinXP HE SP1, VS6SP5)
そこで、ためしに他のプロセスで小さいサイズで共有メモリを取得後、
もうひとつのプロセスで大きいサイズで取得しようとしたところ、
同様のエラーコードが来たので、前回の書き込みをしたのですが。

全プロセス中の最初の MapViewOfFile でエラーになるのですかね?
もしそうなら、それが本当に最初である確証はありますか?
ご存知かもしれませんが、CreateFileMapping 成功後の GetLastError の
戻り値が ERROR_ALREADY_EXISTS かどうかで判断できます。


ki  2004-02-14 22:25:27  No: 53171

CreateFileMapping関数の成功後、GetLastError関数の
戻り値が ERROR_ALREADY_EXISTSでした。

まっさらに(全プロセスを終了)して、ファイルマッピングを作成したところ
正常に4096バイト以上のサイズで、共有メモリが取得できました。

isshiさん、ご指摘ありがとうございます。

もうすでに、共有メモリができていたとは‥

CreateFileMapping関数の成功後、GetLastError関数の
戻り値が ERROR_ALREADY_EXISTSである場合の対処方法は、
全プロセス終了しかないのでしょうか?
Win32APIを使用したもので対処できるものなのでしょうか?


isshi  2004-02-15 01:27:42  No: 53172

前にも書きましたが、オブジェクトのサイズが全プロセスで一致していれば、
何も問題ないはずです。
ひょっとして、同じ名前(今回の場合は、"MAPFILE")で
異なるサイズのオブジェクトを作成しようとしたりしていませんか?
また、関係ないプロセスで同じ名前のオブジェクトを使っていたりしませんか?


ki  2004-02-15 03:52:20  No: 53173

同じ名前で、オブジェクトを作成していました。

方法として別の名前で、作成し直すことにしました。

isshiさん、本当ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加