酌中志txt:How To Export Data from a DLL or an Application

来源:百度文库 编辑:九乡新闻网 时间:2024/04/29 23:30:40

http://support.microsoft.com/kb/90530

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

View products that this article applies to.This article was previously published under Q90530Expand all | Collapse all

SUMMARY

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 );
Back to the top