You are currently offline, waiting for your internet to reconnect

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

This article was previously published under Q90530
It is possible for a Win32-based application to be able to address DLLglobal variables directly by name from within the executable. This is doneby exporting global data names in a way that is similar to the way youexport a DLL function name. Use the following steps to declare and utilizeexported 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 );
NOTE: This technique can also be used to export a global variable from anapplication so that it can be used in a DLL.
For more information on the use of EXPORTS and CONSTANT in the ModuleDefinition 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.
3.10 3.50

Article ID: 90530 - Last Review: 11/21/2006 15:47:00 - Revision: 4.1

Microsoft Win32 Application Programming Interface

  • kbhowto kbdll kbkernbase KB90530