2

CreateFileMappingとOpenFileMappingを使用して、プロセス間でメモリを共有しようとしています。これは私が望むように機能していません-OpenFileMappingはnullを返し、GetLastErrorは5-アクセスが拒否されました。私が間違っていることについて何か考えはありますか?名前はMemoryTestのようなものです。

編集:

CreateFileMappingを両方とも使用すると、他のプロセスで書き込まれたデータを読み取ることができます。これが問題になる理由は、エラー183が発生するためです-メモリ領域はすでに存在します。ただし、それでも既存のメモリへのハンドルを返します。

var map_handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(int), name.c_str());

....

var handle = MapViewOfFile(map_handle, FILE_MAP_ALL_ACCESS , 0, 0, 0)

*handle = 10;

UnMapViewOfFile(map_handle);

getchar();

その他のプロセス:

var map_handle = OpenFileMapping(PAGE_READWRITE, false, name.c_str())

....

var handle = MapViewOfFile(map_handle, FILE_MAP_ALL_ACCESS , 0, 0, 0) //returns null

var out = *handle;

getchar();

ただし、これは2番目のプロセスで機能します。

var map_handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(int), name.c_str());

....

var handle = MapViewOfFile(map_handle, FILE_MAP_ALL_ACCESS , 0, 0, 0) //returns null

var out = *handle;

getchar();
4

2 に答える 2

8

最初から知っておくべき簡単なこと:

  • エラーコード5:ERROR_ACCESS_DENIED「アクセスが拒否されました。」
  • エラーコード183:ERROR_ALREADY_EXISTS「ファイルがすでに存在する場合はファイルを作成できません。」

ERROR_ALREADY_EXISTS文書化された動作であり、ハンドルを受け取るシナリオを示していますが、作成されたのではなく、既存のオブジェクトへのハンドルです。

動作しない場合の問題OpenFileMappingは、最初の引数にあります。API関数は、別の列挙からの値/フラグを予期し、FILE_MAP_*値を取りますが、は取りませんPAGE_*。引数が正しくないと、必要なマッピングを開くことができません。

于 2012-09-19T16:36:58.783 に答える
2

他の誰かが必要な場合、私の場合、エラーはファイルへのアクセスとは関係ありません。CreateFileMappingに提供されたサイズと関係があります。同様のエラーで何時間も費やした後、別の場所に投稿された作業サンプルを使用します。行ごとに違いを比較します。

CreateFileMappingの実行時にファイルのサイズがわからない場合は、0を使用する必要があります。これにより、マップされたファイルのファイルサイズを使用するようにAPIに指示されます。これに関するSOの回答のほとんどは間違っており、人々は何が問題なのかをわざわざテストしていません。私は同様の提案で他の投稿を読んで何時間も無駄にしました。

問題を解決するには、コードは次のようになります。

var map_handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 0, name.c_str());

これにより、他の開発者の時間を節約できることを願っています。

于 2015-01-03T09:44:46.540 に答える