0

現在、ファイルマップを使用してプロセス間通信をテストしようとしています。私がプロデューサーと呼ぶ最初のプログラムは、次のようにファイルマップを作成して書き込む次のコードでエラーが発生しません。

 hEvent = CreateFileMapping(
             INVALID_HANDLE_VALUE,    // use paging file
             NULL,                    // default security
             PAGE_READWRITE,          // read/write access
             0,                       // maximum object size (high-order DWORD)
             256,                // maximum object size (low-order DWORD)
             TEXT("hEvent")); 
        
if (hEvent == NULL)
{
    MessageBox(NULL, TEXT("error: cannot create file map"), TEXT("gotit"), MB_OK);
  _tprintf(TEXT("Could not create file mapping object (%d).\n"),
         GetLastError());
  return 1;
}

 mapBuffer = (LPTSTR) MapViewOfFile(hEvent, FILE_MAP_ALL_ACCESS, NULL, NULL, 256);
            if (mapBuffer == NULL)
{
   MessageBox(NULL, TEXT("error: cannot view map"), TEXT("gotit"), MB_OK);
  _tprintf(TEXT("Could not map view of file (%d).\n"),
         GetLastError());

   CloseHandle(hEvent);

  return 1;
}
        
            CopyMemory((PVOID)mapBuffer, teststring, 256);
            _getch();
            
        

             UnmapViewOfFile(mapBuffer);
             CloseHandle(hEvent);

ただし、2番目のプロセスを模倣している2番目のプログラムでは、次のコードを使用して、このファイルマップを再度開こうとすると、コンシューマーにエラーが発生します。

 hEvent = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, TEXT("hEvent"));
             if (hEvent == NULL)
 {
  MessageBox(NULL, TEXT("error opening filemap"), TEXT("gotit"), MB_OK);
         GetLastError();
  return 1;
 }

それが私の頭の上をまっすぐに進んでいるので、誰かが私が欠けている明らかなものを見ることができますか?

4

1 に答える 1

4

すべてのカーネルオブジェクトと同様に、ファイルマッピングは、最後のハンドルが閉じられると削除されます。最初のプログラムはすぐにハンドルを閉じるので、2番目のプログラムが見つけるものは何もありません。マッピングを存在させたい限り、ハンドルを開いたままにしておく必要があります。

于 2012-04-29T23:50:45.123 に答える