随笔 - 74, 文章 - 0, 评论 - 26, 引用 - 0
数据加载中……

如何共享 DLL 中的所有数据 微软support

概要

Win 32 动态链接库 (DLL) 默认,这意味着使用 DLL 的每个应用程序获取它自己的 DLL 的数据的副本的情况下使用实例数据。 但是,就可以共享 DLL 数据之间所有使用该 DLL 的应用程序。

如果您需要共享仅部分 DLL 数据,Microsoft 建议创建一个新的节和而共享它。 如果您想共享的所有 DLL 静态数据,非常重要做两件事情:
第一次,DLL 必须使用 C 运行时的 DLL 版本 (例如 Crtdll.lib 或 Msvcrt.lib)。 请参阅您的产品文档更多有关使用 C 运行时 DLL 中。

注意: Crtdll.lib 不再 SDK,从 Windows NT 3.51 开始的一部分。 上次发布年 4 月 1995 年上的 MSDN 3.5 SDK。 Win 32 现在要求用户指定的由他们自己的编译器 vender 提供的 C 运行时 LIBs 他们自己的版本。
第二个,您需要指定.data 和.bss 共享。 通常,这样.def 文件的"SECTIONS"部分中。 例如:
   SECTIONS
.bss READ WRITE SHARED
.data READ WRITE SHARED
如果您要使用 Visual C++ 32-bit Edition,您必须指定此使用链接器上的部分开关。 例如:
link -section:.data,rws -section:.bss,rws
只有静态数据被共享。 用对作为 GlobalAlloc() 和 malloc() 这样的 API / 函数的调用动态分配的内存是仍然特定于调用进程。

系统试图加载每个进程中相同的地址处共享的内存块。 但是,如果块不能将加载到相同的内存地址,系统将共享的分区映射到一个不同的内存地址。 仍在共享内存。 请注意该共享节内部指针无效在这种情况下并不能放共享各节中。

更多信息

C 运行时使用全局变量。 如果 CRT 是静态与该 DLL,链接这些变量将在 DLL 的所有客户端之间共享并将最有可能导致的异常 c 0000005。

您要同时指定.data 和.bss 为共享,因为它们每个保存不同类型的数据。 .data 部分包含初始化的数据,.bss 部分保存未初始化的数据。

for sharing in DLL all data one reason is to have in between Win32 DLL (running on Windows NT) and Win32s consistent behavior (running on Windows 3.1). when running on Win32s,32-bit DLL shares among all of that use DLL processes its data。

请注意不需要共享所有数据 Win 32 和 Win32s 之间的行为完全相同。 DLL 可用于将变量存储为实例数据在 Win 32 线程本地存储 (TLS)。

for additional information,please see following article in Microsoft Knowledge Base:
109620 (http://support.microsoft.com/kb/109620/EN-US/) 在一个 Win 32 中创建实例数据 DLL

这篇文章中的信息适用于:
Microsoft Win32 Application Programming Interface 当用于
    Microsoft Windows NT 4.0
    Microsoft Windows NT 3.51 Service Pack 5
    Microsoft Windows NT 4.0
    Microsoft Windows 95
    Microsoft Windows 98 Standard Edition
    the operating system: Microsoft Windows 2000
    the operating system: Microsoft Windows XP

回到顶端

关键字: 
kbmt kbdll kbhowto kbipc kbkernbase KB109619 KbMtzh

posted on 2008-10-28 15:07 井泉 阅读(707) 评论(0)  编辑 收藏 引用 所属分类: c code


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理