内存映射阅读器找不到全局内存映射对象

Posted

技术标签:

【中文标题】内存映射阅读器找不到全局内存映射对象【英文标题】:Memory Map reader cannot find Global Memory Mapped Object 【发布时间】:2019-05-05 22:22:28 【问题描述】:

我正在编写一个创建和写入内存映射文件的 C# 程序。 C++ 程序(从here 粘贴的副本)打开内存映射文件并读取内容。但是,C++ 程序找不到内存映射文件。

我已将对象名称设置为全局(即“Global\MyMemoryMappedObject”),这是用于创建和打开的两个程序的名称here,但这并没有解决问题。

这是我编写的用于创建和写入 MMF 的 C# 代码

public partial class Form1 : Form



    String _szName = "Global\\MyMemoryMappedObject";
    String _szMessage = "Testing";
    int _szSize = 64;

    public Form1()
    
        InitializeComponent();


    

    private void InitMemoryMap()
    
        using (MemoryMappedFile _mmf = MemoryMappedFile.CreateNew(_szName, _szSize, MemoryMappedFileAccess.ReadWriteExecute))
        
            using (MemoryMappedViewAccessor _accessor = _mmf.CreateViewAccessor(0, _szSize, MemoryMappedFileAccess.Write))
            
                byte[] textBytes = Encoding.UTF8.GetBytes(_szMessage);
                _accessor.WriteArray(0, textBytes, 0, textBytes.Length);

                lblStatus.Text = "1";
            
        
    

    private void btnMMap_Click(object sender, EventArgs e)
    
        InitMemoryMap();
    

我希望 C++ 程序能够读取内容,因为它使用相同的对象句柄和偏移量,但它根本找不到要开始的 mmf 对象。谁能帮帮我?

【问题讨论】:

【参考方案1】:

问题是您似乎在打开和关闭它(并释放资源)。

using (MemoryMappedFile _mmf = MemoryMappedFile.CreateNew(...))


 // here you have just released all the resources 

如果您想与其他进程共享此文件,则需要保持打开状态

【讨论】:

哦,好的,我明白了。所以如果我想让它保持打开状态,我可以在括号内添加一个事件处理程序吗?或者有合适的方法吗? @Hayden 不,您可能不会使用 using 语句,并在不同的时间关闭并处置 _mmf 好的,谢谢。我在不使用语句的情况下重写了它,它正在工作。

以上是关于内存映射阅读器找不到全局内存映射对象的主要内容,如果未能解决你的问题,请参考以下文章

内存映射mmap 和 共享内存

Linux内存管理-高端内存

修改内存映射文件时通知/发出信号

修改内存映射文件时通知/发出信号

C++ 类对象内存映射

映射内存和托管内存有啥区别?