为什么CreateFileMapping返回“文件已经存在”?

时间:2013-02-07 11:53:58

标签: delphi winapi shared-memory

我有一个应用程序,它有一个用CreateFileMapping定义的共享内存区域,我试图从另一个应用程序中读取该内存。

我试过了:

handle := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE,
             0,$3200, pchar('FileMappingZone'));

但我明白了:

  

当该文件已存在时无法创建文件

可能是什么问题?

1 个答案:

答案 0 :(得分:15)

并非将GetLastError()值设置为非成功的所有内容都是错误的。首先将错误与函数的返回值区分开来非常重要,并检查GetLastError()以获取有关发生的类错误的更多信息。

对于已存在的映射,记录CreateFileMapping以返回有效句柄以将GetLastError()值设置为ERROR_ALREADY_EXISTS。在这种情况下,错误值是 informational :如果您对打开之前映射是否存在感兴趣,则检查它是有效的,但这不是错误。通过测试返回值为NULL来检测 failure 。否则你只需继续使用手柄。

P.S。如果您想在打开之前确保该部分存在,则可以使用OpenFileMapping,这对于不存在的部分而言将失败,而不是创建新部分。