根据微软(参见this中的第一点),DLL一次只能在系统中运行一个实例,但是我在网上其他地方读取的内容包括SO,进程可以加载同一个dll的多个实例,并且可以使用内存映射技术共享dll中的只读数据,但每个进程都有自己的写入数据副本,这些数据存储在自己的内存空间中。
此外,在同一链接的第二点,DLL不能拥有自己的堆栈,内存句柄,全局内存等,但据我所知,因为可以导出多个函数和/或dll,这些必须有自己的堆栈,文件句柄等。为什么DLL中定义的全局变量不能被视为使用全局内存?
我在使用C ++。
答案 0 :(得分:1)
以单数形式使用的DLL的上下文没有多大意义。为了更好地理解,请将DLL与在进程中加载的上下文结合使用。 文档是正确的。作为DLL中的代码/导出函数的一部分的线程将具有其堆栈。进程具有内存句柄,全局内存......但不是单独的线程。 如果您在DLL中定义了一个全局变量,那么它的全局变量将映射到它所映射到的进程的上下文中。 如果DLL被映射到多个进程,那么每个进程都会获得它自己的全局变量。 它是维护进程隔离/完整性的一部分(每个进程都有自己的内存区域,处理表..等等)
HTH