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

opc*_*0de 7 delphi winapi shared-memory

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

我试过这个:

handle := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE,
             0,$3200, pchar('FileMappingZone'));
Run Code Online (Sandbox Code Playgroud)

但我得到:

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

可能是什么问题呢?

Ant*_*nko 15

并非一切GetLastError()对不成功都有价值的东西都是错误的.首先要根据函数的返回值来区分错误,然后检查GetLastError()以获得有关发生的错误类型的更多信息.

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

PS如果要在打开之前确保该部分存在,则可以使用OpenFileMapping哪个部分对于不存在的部分失败而不是创建新部分.