已分配内存的范围

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

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

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

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

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

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