Dynamic-Link库数据

Dynamic-Link库 (DLL) 可以包含全局数据或本地数据。

变量范围

编译器和链接器将 DLL 源代码文件中声明为全局的变量视为全局变量,但加载给定 DLL 的每个进程都会获取该 DLL 的全局变量的自身副本。 静态变量的范围仅限于在其中声明静态变量的块。 因此,默认情况下,每个进程都有自己的 DLL 全局变量和静态变量实例。

注意

开发工具可能允许重写默认行为。 例如,Visual C++ 编译器支持 #pragma 节 ,链接器支持 /SECTION 选项。 有关详细信息,请参阅开发工具附带的文档。

 

动态内存分配

当 DLL 使用 GlobalAllocLocalAllocHeapAllocVirtualAlloc) 的任何内存分配 (函数分配内存时,内存在调用进程的虚拟地址空间中分配,并且只能由该进程的线程访问。

DLL 可以使用文件映射来分配可在进程之间共享的内存。 有关如何使用文件映射创建命名共享内存的一般讨论,请参阅 文件映射。 有关使用 DllMain 函数通过文件映射设置共享内存的示例,请参阅 在Dynamic-Link库中使用共享内存

线程本地存储

线程本地存储 (TLS) 函数使 DLL 能够分配索引,以便为多线程进程的每个线程存储和检索不同的值。 例如,每次用户打开新电子表格时,电子表格应用程序都可以创建同一线程的新实例。 为各种电子表格操作提供函数的 DLL 可以使用 TLS 保存有关每个电子表格的当前状态的信息, (行、列等) 。 有关线程本地存储的一般讨论,请参阅 线程本地存储。 有关使用 DllMain 函数设置线程本地存储的示例,请参阅 在Dynamic-Link库中使用线程本地存储

Windows Server 2003 和 Windows XP: Visual C++ 编译器支持用于声明线程局部变量的语法: _declspec (线程) 。 如果在 DLL 中使用此语法,将无法在 Windows Vista 之前的 Windows 版本上使用 LoadLibraryLoadLibraryEx 显式加载 DLL。 如果 DLL 将被显式加载,则必须使用线程本地存储函数,而不是 _declspec (线程)