分享

DLL导出变量

 imelee 2017-09-26
     DLL定义的全局变量可以被调用进程访问;DLL也可以访问调用进程的全局
  1. /* 文件名:lib.h */  
  2. #ifndef LIB_H  
  3. #define LIB_H  
  4.   extern int dllGlobalVar;  
  5. #endif  
  6.   
  7.   
  8. /* 文件名:lib.cpp */  
  9. #include "lib.h"  
  10. #include <windows.h>  
  11. int dllGlobalVar;  
  12.   
  13. BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)  
  14. {  
  15.    switch (ul_reason_for_call)  
  16.    {  
  17.      case DLL_PROCESS_ATTACH:  
  18.           dllGlobalVar = 100; //在dll被加载时,赋全局变量为100  
  19.            break;  
  20.     case DLL_THREAD_ATTACH:  
  21.     case DLL_THREAD_DETACH:  
  22.     case DLL_PROCESS_DETACH:  
  23.     break;  
  24.   }  
  25.   return TRUE;  
  26. }  
  27.   
  28.   
  29. ;文件名:lib.def  
  30. ;在DLL中导出变量  
  31. LIBRARY "dllTest"  
  32. EXPORTS  
  33. dllGlobalVar CONSTANT  
  34.     ;或dllGlobalVar DATA  
  35. GetGlobalVar  

 

       从lib.h和lib.cpp中可以看出,全局变量在DLL中的定义和使用方法与一般的程序设计是一样的。若要导出某全局变量,我们需要在.def文件的EXPORTS后添加:

                   变量名 CONSTANT   //过时的方法
                    或

                   变量名 DATA     //VC++提示的新方法

 

  1. 在主函数中引用DLL中定义的全局变量:  
  2.   
  3. #include <stdio.h>  
  4. #pragma comment(lib,"dllTest.lib")  
  5.   
  6. extern int dllGlobalVar;  
  7. int main(int argc, char *argv[])  
  8. {  
  9.    printf("%d ", *(int*)dllGlobalVar);  
  10.    *(int*)dllGlobalVar = 1;  
  11.    printf("%d ", *(int*)dllGlobalVar);  
  12.    return 0;  
  13. }  

 

         特别要注意的是用extern int dllGlobalVar声明所导入的并不是DLL中全局变量本身,而是其地址,应用程序必须通过强制指针转换来使用DLL中的全局变量。这一点,从*(int*)dllGlobalVar可以看出。因此在采用这种方式引用DLL全局变量时,千万不要进行这样的赋值操作:

                dllGlobalVar = 1;
  其结果是dllGlobalVar指针的内容发生变化,程序中以后再也引用不到DLL中的全局变量了。

 

  1. 在应用工程中引用DLL中全局变量的一个更好方法是:  
  2.   
  3.   
  4. #include <stdio.h>  
  5. #pragma comment(lib,"dllTest.lib")  
  6.   
  7. extern int _declspec(dllimport) dllGlobalVar; //用_declspec(dllimport)导入  
  8.   
  9. int main(int argc, char *argv[])  
  10. {  
  11.   printf("%d ", dllGlobalVar);  
  12.   dllGlobalVar = 1; //这里就可以直接使用, 无须进行强制指针转换  
  13.    printf("%d ", dllGlobalVar);  
  14.    return 0;  
  15. }  
  16.   
  17.   
  18.   通过_declspec(dllimport)方式导入的就是DLL中全局变量本身而不再是其地址了,笔者建议在一切可能的情况下都使用这种方式。  




 




 

 

 

 

 

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多