您的位置:首页 > 其它

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

2009-12-22 14:37 507 查看
今天做程序需要导出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; //这里就可以直接使用, 无须进行强制指针转换
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: