HOWTO: Specify Shared and Nonshared Data in a DLLLast reviewed: March 20, 1998Article ID: Q100634 |
The information in this article applies to:
SUMMARYTo 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 then this address is valid only in one process space. If the address is in the shared data segment, it will be valid as long as the above relocation doesn’t occur. Since 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’s 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).
MORE INFORMATIONBelow 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 Code
#pragma data_seg(".MYSEC") int iSharedVar = 0; #pragma data_seg()You must also tell the linker that the variables in the section you defined are to be shared by modifying your .def file to include a SECTIONS section or by specifying /SECTION:.MYSEC,RWS in your link line. For example, aSECTIONS section could look like:
SECTIONS .MYSEC READ WRITE SHAREDAlternatively, some compilers allow you to set the linker switch in your code so that if your file is ever copied to another project, the linker switch goes with it. To do this, include the following line in your code preferably near the #pragma data_seg(".MYSEC") line:
#pragma comment(linker, "/SECTION:.MYSEC,RWS")Be careful not to include any extraneous spaces inside the quotation marks because this may cause the linker to misinterpret the directive. NOTE: 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.
|
Additional query words: memory mapped win95 winnt nt40
© 1998 Microsoft Corporation. All rights reserved. Terms of Use. |