我有一个应用程序,使用CreateFileMapping
定义了一个共享内存区域,我正在尝试从另一个应用程序中读取该内存。
我尝试了以下方法:
handle := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE,
0,$3200, pchar('FileMappingZone'));
但是我得到了:
当该文件已经存在时,无法创建文件
可能的问题是什么?
我有一个应用程序,使用CreateFileMapping
定义了一个共享内存区域,我正在尝试从另一个应用程序中读取该内存。
我尝试了以下方法:
handle := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE,
0,$3200, pchar('FileMappingZone'));
但是我得到了:
当该文件已经存在时,无法创建文件
可能的问题是什么?
GetLastError()
返回非成功值并不代表一定发生了错误。重要的是先通过函数的返回值区分错误,然后再检查GetLastError()
以获取有关所发生错误类型的更多信息。
对于已经存在的映射,文档中记录 CreateFileMapping
返回一个有效句柄并且将GetLastError()
设为ERROR_ALREADY_EXISTS
。在这种情况下,错误值是信息性的:如果您想知道打开它之前是否存在映射,则可以检查它,但它不是错误。通过测试返回值是否为空来检测失败。否则,只需继续使用句柄。
P.S. 如果您希望确保在打开之前部分存在,则可以使用OpenFileMapping
,它将针对不存在的部分而不是创建新部分而失败。
CreateFileMapping()
来共享数据,而阅读应用程序应该使用OpenFileMapping()
来读取共享的数据,而不是CreateFileMapping()
。如果OpenFileMapping()
失败,那么共享应用程序就没有共享任何数据(除非发生其他错误,比如阅读应用程序没有权限访问共享应用程序的映射)。我不会让一个读取应用程序创建映射,除非它打算共享自己的数据。 - Remy Lebeau
GetLastError
?预期CreateFileMapping
返回有效句柄并且以下GetLastError
返回ERROR_ALREADY_EXISTS
(如果这是您期望的结果,则实际上不是错误)。 - Anton KovalenkoGetLastError
。而且只有当CreateFileMapping
返回NULL
时才需要这样做。 - David HeffernanGetLastError
有时候应该在非错误情况下进行检查,不像errno
。但是重要的是不要将其值解释为错误。 - Anton Kovalenko