HOWTO: How To Export Data from a DLL or an Application

Article translations Article translations
Article ID: 90530 - View products that this article applies to.
This article was previously published under Q90530
Expand all | Collapse all

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.

Properties

Article ID: 90530 - Last Review: November 21, 2006 - Revision: 4.1
APPLIES TO
  • Microsoft Win32 Application Programming Interface, when used with:
    • Microsoft Windows NT Advanced Server 3.1
    • Microsoft Windows NT 4.0
    • Microsoft Windows NT 3.51 Service Pack 5
    • Microsoft Windows NT 4.0
    • Microsoft Windows 95
    • Microsoft Windows 2000 Standard Edition
    • the operating system: Microsoft Windows XP
Keywords: 
kbhowto kbdll kbkernbase KB90530

Give Feedback

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com