HOWTO: Share All Data in a DLLID: Q109619
|
Win32 dynamic-link libraries (DLLs) use instance data by default, meaning that each application that uses a DLL gets its own copy of the DLL's
data. However, it is possible to share the DLL data among all applications that use the DLL.
If you need to share only some of the DLL data, Microsoft recommends creating a new section and sharing it instead.
If you want to share all of the DLL static data, it is important to
do two things:
SECTIONS
.bss READ WRITE SHARED
.data READ WRITE SHARED
If you are using Visual C++ 32-bit Edition, you must specify this
using the -section switch on the linker. For example:
link -section:.data,rws -section:.bss,rws
The C run-time uses global variables. If the CRT is statically linked to
the DLL, these variables will be shared among all clients of the DLL and
will most likely cause an exception c0000005.
You need to specify both .data and .bss as shared because
they each hold different types of data. The .data section holds initialized
data and the .bss section holds the uninitialized data.
One reason for sharing all data in a DLL is to have consistent behavior in
the DLL between Win32 (running on Windows NT) and Win32s (running on
Windows 3.1). When running on Win32s, a 32-bit DLL shares its data among
all of the processes that use the DLL.
Note that it is not necessary to share all data to behave identically
between Win32 and Win32s. The DLL can use thread local storage (TLS) on
Win32s to store variables as instance data.
For additional information, please see the following
article in the Microsoft Knowledge Base:
Q109620 Creating Instance Data in a Win32s DLL
Additional query words: 3.10 3.50
Keywords : kbDLL kbKernBase kbGrpKernBase
Version : winnt:3.5,3.51,4.00
Platform : winnt
Issue type : kbhowto
Last Reviewed: April 28, 1999