这是因为不同的进程拥有不同的虚拟地址空间,每个进程都有自己的独立地址空间,它们之间不能直接访问对方的地址空间。在这种情况下,如果一个进程向共享内存中写入一个指针,另一个进程无法直接使用这个指针,因为它指向的地址在另一个进程的地址空间中是无效的。

为了解决这个问题,可以使用相对虚拟地址(Relative Virtual Address,RVA)来访问共享内存中的数据。相对虚拟地址是相对于共享内存的基地址计算得出的地址,它可以在不同的进程中保持一致,因此可以用来访问共享内存中的数据。

具体来说,写进程可以将指针转换为相对虚拟地址,并将其写入共享内存中。读进程可以从共享内存中读取相对虚拟地址,并将其转换为指针来访问共享内存中的数据。这样,两个进程就可以在共享内存中共享指针指向的数据了。

需要注意的是,使用相对虚拟地址需要保证共享内存的基地址在两个进程中是一致的。可以通过使用同一个名称的MemoryMappedFile对象来实现这一点。具体来说,写进程和读进程都应该使用同一个名称的MemoryMappedFile对象来打开共享内存,这样它们就可以共享同一个基地址了。

c#程序使用MemoryMappedFile和MemoryMappedViewAccessor在一个进程写IntPtr另一个进程读IntPtr的数据但是由于这两个进程在不同的虚拟地址空间中运行因此读进程无法访问写进程中指针指向的地址

原文地址: https://www.cveoy.top/t/topic/dhLb 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录