HOWTO: How To Export Data from a DLL or an Application |
Q90530
The information in this article applies to:
- Microsoft Win32 Application Programming Interface (API), used with:
- the operating system: Microsoft Windows NT, versions 3.1, 3.5, 3.51, 4.0
- Microsoft Windows 95
- the operating system: 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 kbOSWinNT310 kbOSWinNT350 kbOSWinNT351 kbOSWinNT400 kbOSWin2000 kbOSWin95 kbDSupport kbGrpDSKernBase
Issue type : kbhowto
Technology : kbAudDeveloper kbWin32sSearch kbWin32API
Last Reviewed: December 16, 2000 |