创建命名共享内存文件以传输大量数据

时间:2016-12-19 08:45:51

标签: c++ windows winapi memory-mapped-files

Creating Named Shared Memory上使用MSDN的示例,我有一些问题(注意:变量名称内联是从超链接中的示例进程1引用的):

  • 是否可以在进程1中将高长度消息(即szMsg.length()> 4000)复制到缓冲区(pBuf)?

  • 创建文件映射对象所允许的最大缓冲区大小(BUF_SIZE)是多少?

  • 如果是,用于创建映射对象的缓冲区大小与消息长度之间的关系是什么(即..在示例中,BUF_SIZE vs szMsg)

我问这些问题,因为当我尝试复制长度为>的消息时4000,尽管buf_size从512增加到1024甚至更高,但它仍然存在访问冲突错误。

我是编码的新手。请向我解释如何创建一个可以容纳高长度消息的文件映射对象。

1 个答案:

答案 0 :(得分:1)

如果写入超过BUF_SIZE个字节,Windows不保证会发生什么。但实际上,文件映射将向上舍入到内存页面(恰好是4096)。因此,如果你指定一个"小"对于BUF_SIZE的值,您将获得最多包含4096字节的消息 - 但如果您写入4097字节,则可能会(*)获得访问冲突。

*:如果您运气不好,下一页已经映射到流程中,您将覆盖其他一些重要信息。

解决方案:您必须将BUF_SIZE设置为至少与要发送的最大邮件一样大。

  

用于创建映射的缓冲区大小之间的关系是什么   对象与消息的长度。(即..在示例中,BUF_SIZE vs   szMsg

答:BUFSIZE必须大于或等于szMsg