DLL中导出全局变量的方法及导入时需要注意的问题

      今天做程序需要导出DLL中的一个全局指针,可是导出后只要一使用就会发生access violation,后来在网上找了找文章,原来是之前导入方法存在问题,下面把整个DLL导出导入全局函数的方法整理一下,作为记录。整个文章大部分参考http://www.pconline.com.cn/pcedu/empolder/gj/vc/0509/699672_7.html,这篇文章写的很不错,有兴趣的可以看看。

 

       全局变量的导出 方法:

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

 

变量名 CONSTANT    //过时的方法


  或

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

 

       全局变量的导入使用 方法:

extern int dllGlobalVar;

printf("%d ", *(int*)dllGlobalVar);
*(int*)dllGlobalVar = 1;

 

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

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

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

 

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

 

      通过_declspec(dllimport)方式导入的就是DLL中全局变量本身而不再是其地址了,建议在一切可能的情况下都使用这种方式。这时如下的赋值操作就可以直接使用:

 

dllGlobalVar = 1; //这里就可以直接使用, 无须进行强制指针转换

 


你可能感兴趣的:(Windows开发,dll,access)