DLL导出变量

   DLL定义的全局变量可以被调用进程访问;DLL也可以访问调用进程的全局
/* 文件名:lib.h */
#ifndef LIB_H
#define LIB_H
  extern int dllGlobalVar;
#endif


/* 文件名:lib.cpp */
#include "lib.h"
#include <windows.h>
int dllGlobalVar;

BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
   switch (ul_reason_for_call)
   {
     case DLL_PROCESS_ATTACH:
          dllGlobalVar = 100; //在dll被加载时,赋全局变量为100
           break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
    break;
  }
  return TRUE;
}


;文件名:lib.def
;在DLL中导出变量
LIBRARY "dllTest"
EXPORTS
dllGlobalVar CONSTANT
    ;或dllGlobalVar DATA
GetGlobalVar

 

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

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

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

 

在主函数中引用DLL中定义的全局变量:

#include <stdio.h>
#pragma comment(lib,"dllTest.lib")

extern int dllGlobalVar;
int main(int argc, char *argv[])
{
   printf("%d ", *(int*)dllGlobalVar);
   *(int*)dllGlobalVar = 1;
   printf("%d ", *(int*)dllGlobalVar);
   return 0;
}

 

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

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

 

在应用工程中引用DLL中全局变量的一个更好方法是:


#include <stdio.h>
#pragma comment(lib,"dllTest.lib")

extern int _declspec(dllimport) dllGlobalVar; //用_declspec(dllimport)导入

int main(int argc, char *argv[])
{
  printf("%d ", dllGlobalVar);
  dllGlobalVar = 1; //这里就可以直接使用, 无须进行强制指针转换
   printf("%d ", dllGlobalVar);
   return 0;
}


  通过_declspec(dllimport)方式导入的就是DLL中全局变量本身而不再是其地址了,笔者建议在一切可能的情况下都使用这种方式。





 




 

 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值