HOWTO: How To Export Data from a DLL or an Application
ID: Q90530
|
The information in this article applies to:
-
Microsoft Win32 Application Programming Interface (API), used with:
-
Microsoft Windows NT versions 3.1, 3.5, 3.51, 4.0
-
Microsoft Windows 95
-
Microsoft Windows 2000
SUMMARY
It is possible for a Win32-based application to be able to address DLL
global variables directly by name from within the executable. This is done
by exporting global data names in a way that is similar to the way you
export a DLL function name. Use the following steps to declare and utilize
exported global data.
- Define the global variables in the DLL code. For example:
int i = 1;
int *j = 2;
char *sz = "WBGLMCMTP";
- Export the variables in the module-definition (DEF) file. With the 3.1
SDK linker, use of the CONSTANT keyword is required, as shown below:
EXPORTS
i CONSTANT
j CONSTANT
sz CONSTANT
With the 3.5 SDK linker or the Visual C++ linker, use of the DATA
keyword is required, as shown below
EXPORTS
i DATA
j DATA
sz DATA
Otherwise, you will receive the warning
warning LNK4087: CONSTANT keyword is obsolete; use DATA
Alternately, with Visual C++, you can export the variables with:
_declspec( dllexport ) int i;
_declspec( dllexport ) int *j;
_declspec( dllexport ) char *sz;
- If you are using the 3.1 SDK, declare the variables in the modules that
will use them (note that they must be declared as pointers because a
pointer to the variable is exported, not the variable itself):
extern int *i;
extern int **j;
extern char **sz;
If you are using the 3.5 SDK or Visual C++ and are using DATA, declare
the variables with _declspec( dllimport ) to avoid having to manually
perform the extra level of indirection:
_declspec( dllimport ) int i;
_declspec( dllimport ) int *j;
_declspec( dllimport ) char *sz;
- If you did not use _declspec( dllimport ) in step 3, use the values by
dereferencing the pointers declared:
printf( "%d", *i );
printf( "%d", **j );
printf( "%s", *sz );
It may simplify things to use #defines instead; then the variables can
be used exactly as defined in the DLL:
#define i *i
#define j *j
#define sz *sz
extern int i;
extern int *j;
extern char *sz;
printf( "%d", i );
printf( "%d", *j );
printf( "%s", sz );
MORE INFORMATION
NOTE: This technique can also be used to export a global variable from an
application so that it can be used in a DLL.
REFERENCES
For more information on the use of EXPORTS and CONSTANT in the Module
Definition File (DEF) file for the 3.1 SDK, see Chapter 4 of the Win32 SDK
"Tools" manual.
For more information regarding _declspec(dllexport), or the EXPORT def file keyword search the Visual C++ documentation or your vendor's compiler documentation regarding exporting objects.
Additional query words:
3.10 3.50
Keywords : kbDLL kbKernBase kbNTOS310 kbNTOS350 kbNTOS351 kbNTOS400 kbWinOS2000 kbWinOS95 kbDSupport kbGrpKernBase
Version : winnt:3.1,3.5,3.51,4.0
Platform : winnt
Issue type : kbhowto
|