已分配内存的范围

进程使用内存分配函数(HeapAllocVirtualAllocGlobalAllocLocalAlloc)分配的所有内存只能访问进程。 但是,DLL 分配的内存是在调用 DLL 的进程地址空间中分配的,并且无法使用同一 DLL 访问其他进程。 若要创建共享内存,必须使用文件映射。

命名文件映射提供了一种创建共享内存块的简单方法。 进程可以使用 CreateFileMapping 函数创建文件映射对象时指定名称。 其他进程可以将同名指定给 CreateFileMapping,也可以 OpenFileMapping 函数来获取映射对象的句柄。

每个进程指定对 MapViewOfFile 函数中的文件映射对象的句柄,以便将文件的视图映射到其自己的地址空间。 单个文件映射对象的所有进程的视图将映射到物理存储的同一可共享页面。 但是,映射视图的虚拟地址可能因一个进程而异,除非使用 MapViewOfFileEx 函数在指定地址处映射视图。 虽然可共享,但用于映射文件视图的物理存储页不是全局的;没有映射文件的视图的进程无法访问它们。

当映射对象视图的最后一个进程终止或取消映射其视图时,通过调用 UnmapViewOfFile 函数释放通过映射文件视图提交的任何页面。 此时,将更新与映射对象关联的指定文件(如果有)。 还可以通过调用 FlushViewOfFile 函数来强制更新指定的文件。

有关详细信息,请参阅 文件映射。 有关 DLL 中共享内存的示例,请参阅 在 Dynamic-Link 库中使用共享内存

如果多个进程对共享内存具有写入访问权限,则必须同步对内存的访问。 有关详细信息,请参阅 同步