加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

c++的dll导出全局变量

(2015-10-25 15:16:51)
标签:

文化

分类: c
1.运行环境:
vs2005 debug Win32 ,MFC dll 工程和MFC exe工程(对话框)。


2.调用关系:
Fun.dll  导出全局变量int global_val;
liupf.exe 调用Fun.dll int global_val

3.步骤:
(1)Fun.dll(为了简单起见,不再新建.h和.cpp文件,就利用DLL工程自动生成的文件Fun.h Fun.cpp)

Fun.h         :     extern int global_val;         //声明全局变量global_val

Fun.cpp     :     int global_val;                    //定义全局变量global_val
                        CFunApp::CFunApp()
                       {
                          global_val = 10;            //找到构造函数,在其中初始化global_val
                       }



Fun.def    :    global_val CONSTANT     //导出全局变量global_val(也可以用DATA代替CONSTANT,但                                                                      //后面的liupf.exe会报错不知为何,所以暂时用旧版CONSTANT)


(2)liupf.exe
(同上为了简单起见,不再新建.h和.cpp文件,就利用EXE工程自动生成的文件liupfDlg.h liupfDlg.cpp)

liupfDlg.cpp:
#pragma comment(lib,"E:\\vs2005Project\\bin\\Fun.lib")
extern int global_val;   //导入

//下面就可以使用global_val
void CliupfDlg::OnBnClickeon1()
{

 int yyy  = *(int*)global_val; //10

}

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



还有另外一种方法导入:

#pragma comment(lib,"E:\\vs2005Project\\bin\\Fun.lib")

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

通过_declspec(dllimport)方式导入的就是DLL中全局变量本身而不再是其地址了,global_val= 1; //这里就可以直接使用, 无须进行强制指针转换
但这种方式,我没成功,编译一直报错!


0

阅读 收藏 喜欢 打印举报/Report
后一篇:指针
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有