How To Share All Data in a DLL (109619)
The information in this article applies to:
- Microsoft Win32 Application Programming Interface (API), when used with:
- the operating system: Microsoft Windows NT 3.5
- the operating system: Microsoft Windows NT 3.51
- the operating system: Microsoft Windows NT 4.0
- the operating system: Microsoft Windows 95
- the operating system: Microsoft Windows 98
- the operating system: Microsoft Windows 2000
- the operating system: Microsoft Windows XP
This article was previously published under Q109619 SUMMARY
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:
- First, the DLL must use the DLL version of the C run-time (for example
Crtdll.lib or Msvcrt.lib). Please see your product documentation for
more information about using the C run-time in a DLL.
NOTE: Crtdll.lib is no longer part of the SDK, starting with Windows NT 3.51. It was last released on the April 1995 MSDN 3.5 SDK. Win32 now
requires users to specify their own version of C run-time LIBs supplied
by their own compiler vender.
- Second, you need to specify that both .data and .bss are shared.
Often, this is done in the "SECTIONS" portion of the .def file. For
example:
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
Only static data is shared. Memory allocated dynamically with calls to
such APIs/functions as GlobalAlloc() and malloc() are still specific to
the calling process.
The system tries to load the shared memory block at the same address in
each process. However, if the block cannot be loaded into the same memory
address, the system maps the shared section into a different memory
address. The memory is still shared. Note that the pointers inside the
shared section are invalid under this circumstance and cannot be placed in
shared sections.
Modification Type: | Minor | Last Reviewed: | 3/1/2005 |
---|
Keywords: | kbDLL kbhowto kbIPC kbKernBase KB109619 |
---|
|