Article ID: 100634 - Last Review: June 2, 2005 - Revision: 3.0 How to specify both shared data and non-shared data in a DLL in Visual C++This article was previously published under Q100634 NOTE: Microsoft Visual C++ NET (2002) supported both the managed code
model that is provided by the .NET Framework and the unmanaged native Windows
code model. The information in this article applies to unmanaged Visual C++
code only. On This PageSUMMARY To have both shared and non-shared data in a Dynamic Link
Library (DLL) which is built with a 32-bit Microsoft C compiler, you need to
use the #pragma data_seg directive to set up a new named section. Then you must
inform the linker of the correct sharing attributes for this new named data
section using either the .def file or a linker switch. The system tries to load the shared memory block created by #pragma data_seg at the same address in each process. However, if the block cannot be loaded into the same memory address, it is mapped to a different address, but it is still shared. NOTE: If the block contains pointers, this can be a problem. If the pointer holds the address of a variable not in the shared data segment, this address is valid only in one process space. If the address is in the shareddata segment, it will be valid as long as the above relocation does not occur. Because this is unreliable, you should not use pointers. You can use arrays in a shared data segment, but do so with caution. The array name is a pointer. Do not pass this value between processes. For example, if you have a string declared in the shared data segment as char Customer[20] = {0}, it is okay for each process to use that variable name, as in strcpy(buf, Customer) or char FirstInitial = Customer[0]. However, do not pass the value of Customer to another process as in PostMessage(hwndNotMyWindow, WM_USER, 0, (LPARAM)Customer). It is not recommended to use pointers or arrays in the shared data segment, because relocation can break the sharing between processes. If you must use them, you can minimize the chances of seeing this relocation if you intentionally change the preferred base address of the DLL. You can do this by using the Rebase.exe utility, or you can use the /BASE linker switch when building the image with Visual C++. If you don't change the preferred base address, you may see output during debugging that resembles the following: LDR: Dll NAME.DLL base 10000000 relocated due to collision with [path to another DLL]. MORE INFORMATION Below is a sample of how to define a named data section in
your DLL. The first line directs the compiler to include all the data declared
in this section in the .MYSEC data segment. This means that the iSharedVar
variable would be considered part of the .MYSEC data segment. By default, data
is nonshared. Note that you must initialize all data in your named section. The data_seg pragma only applies to initialized data. The third line below, "#pragma data_seg()", directs the compiler to reset allocation to the default data section. Sample CodeNOTE: By convention, each section name begins with a period. (The period is not required.) All section names must not be longer than eight characters, including the period character. APPLIES TO
| Article Translations
|
Back to the top
