【问题标题】:OpenFileMapping issues, can't find filemapOpenFileMapping 问题,找不到文件映射
【发布时间】:2012-05-09 18:08:34
【问题描述】:

我目前正在尝试使用文件映射来测试进程间通信。我将调用生产者的第一个程序在以下创建文件映射并写入它的代码上不会出错,如下所示:

 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);

但是,我的第二个程序模仿第二个进程,我将命名消费者,在尝试使用以下代码重新打开此文件映射时出错:

 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;
 }

谁能看出我遗漏了什么明显的东西?

【问题讨论】:

  • 将您的映射对象命名为独特的名称,以防万一其他软件也使用命名文件映射。
  • 哈哈,真是个愚蠢的错误。事实证明,在第二个进程获得它之前,我在第一个进程中结束了句柄。关闭句柄(hEvent);我把它从第一个过程中取出,它停止了第二个错误。
  • 另外,这两个程序是否由同一用户运行?在相同的隔离级别?
  • 他们都在同一台计算机上,在不同的 visStud 项目中。我想我已经解决了这个问题,现在只是为了让它正确读取我在两者之间传递的字符串。
  • 我认为复制句柄比使用命名对象更安全。在 windows 中如何命名命名对象没有规则。

标签: c++ c winapi file-mapping


【解决方案1】:

像所有内核对象一样,文件映射会在最后一个句柄关闭时被删除。由于您的第一个程序立即关闭句柄,因此第二个程序找不到任何内容。只要您希望映射存在,就必须保持句柄打开。

【讨论】:

  • 从字面上看 3 分钟前我发现了我自己的愚蠢错误:虽然我会选择你的答案,因为它会帮助与我在同一条船上的任何人都不会碰巧得到他们的答案错误直接打他们的脸。
  • +1 为我的愚蠢代码,生产者代码CloseHandle()MapViewOfFile 之后,消费者找不到资源。
  • 在创建时使用OBJ_PERMANENT 或调用ZwMakePermanentObject 除外。但需要有SeCreatePermanentPrivilege
猜你喜欢
  • 2016-03-09
  • 2013-09-18
  • 1970-01-01
  • 1970-01-01
  • 2017-06-23
  • 2016-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多