DLL中导出全局变量

DLL中导出全局变量

 

 

  DLL定义的全局变量可以被调用进程访问;DLL也可以访问调用进程的全局数据,我们来看看在应用工程中引用DLL中变量的例子



#ifndef LIB_H
#define LIB_H
extern int dllGlobalVar;
#endif



#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>

//加载静态链接库dllTest.lib
#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中全局变量本身而不再是其地址了,笔者建议在一切可能的情况下都使用这种方式。



文章来自: 本站原创
Tags:
评论: 0 | 查看次数: 13676