Microsoft KB Archive/90530

{|
 * width="100%"|

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 = &quot;WBGLMCMTP&quot;;   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( &quot;%d&quot;, *i ); printf( &quot;%d&quot;, **j ); printf( &quot;%s&quot;, *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( &quot;%d&quot;, i ); printf( &quot;%d&quot;, *j ); printf( &quot;%s&quot;, sz ); </li></ol>

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.