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.

  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.


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


Last Reviewed: January 11, 2000
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.