How To Export Data from a DLL or an Application

ID: Q90530

4.00    | 3.10 3.50 3.51 4.00
WINDOWS | WINDOWS NT kbprg kbhowto

The information in this article applies to:

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.

1. Define the global variables in the DLL code. For example:

      int i = 1;
      int *j = 2;
      char *sz = "WBGLMCMTP";

2. 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;

3. 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;

4. 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.

REFERENCE

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.

KBCategory: kbprg kbhowto KBSubcategory: BseDll Additional reference words: 3.10 3.50 4.00 95

Keywords          : kbDLL kbKernBase kbGrpKernBase 
Version           : 4.00    | 3.10 3.50 3.51 4.00
Platform          : NT WINDOWS

Last Reviewed: December 18, 1996