gpt4 book ai didi

C++:带有内存映射文件的 DLL

转载 作者:可可西里 更新时间:2023-11-01 11:31:44 39 4
gpt4 key购买 nike

我有一个 DLL 可能会被多个应用程序同时调用。这个 DLL 内存映射一个文件。

我有两个问题:

1) 每个应用程序都会创建自己的 DLL 实例,对吗?因此,该文件将被内存映射多次

2) 如果这是真的,我不明白这里发生了什么:

a) 应用程序 A 调用 DLL。b) 应用程序 B 调用 DLL。c) 我退出应用程序 A,DLL 将取消映射该文件。d) 应用程序B调用DLL,内存映射文件不可用,调用失败。

我不明白这个。有人做吗?

谢谢。

最佳答案

发生这种情况是因为 1) 中的假设是错误的。根据定义,dll 是共享的;两个应用程序都使用相同的 dll 实例,因此当您在一个应用程序中释放该文件时,其他应用程序将无法使用它。

要解决您的问题,您应该实现一些引用计数机制,以便仅在没有进程使用文件时取消映射文件。

编辑:@sumeet 是对的。每个进程都有自己的地址空间;当两个进程加载同一个 dll 时,它们可能会共享其只读数据以提高效率,但它们的可写数据对于每个进程都是本地的。然而,内存映射文件是一个内核对象,就像信号量、管道和共享内存一样。因此,如果您在一个进程中取消映射,那么您将取消所有进程的映射。

Edit2:来自 MSDN (备注部分):

Multiple processes can share a view of the same file by either using asingle shared file mapping object or creating separate file mappingobjects backed by the same file. A single file mapping object can beshared by multiple processes through inheriting the handle at processcreation, duplicating the handle, or opening the file mapping objectby name. For more information, see the CreateProcess, DuplicateHandleand OpenFileMapping functions.

[...]

Mapped views of a file mapping object maintain internal references tothe object, and a file mapping object does not close until allreferences to it are released. Therefore, to fully close a filemapping object, an application must unmap all mapped views of the filemapping object by calling UnmapViewOfFile and close the file mappingobject handle by calling CloseHandle. These functions can be called inany order.

首先从第一段开始,各个app是怎么初始化view的?从第二段中,我了解到从每个应用程序调用 UnmapViewofFileCloseHandle 将释放对内存文件的所有引用,然后 Windows 将自动释放相关资源(即他保持引用计数,你不需要这样做)。发布两个应用程序的内存映射初始化和关闭代码。

关于C++:带有内存映射文件的 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19008154/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com