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

我尝试了这个:

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

但我得到:



可能是什么问题呢?

最佳答案

并非所有将GetLastError()值设置为不成功的东西都是错误。首先通过函数的返回值区分错误很重要,然后检查 GetLastError() 以获取有关发生的错误类型的更多信息。

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

附言如果您想在打开之前确保该部分存在,您可以使用 OpenFileMapping ,它会为不存在的部分失败,而不是创建一个新的部分。

关于delphi - 为什么 CreateFileMapping 返回 "file already exists"?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14750511/

10-09 09:33