=================================版权声明=================================

版权声明:原创文章 禁止转载 

请通过右侧公告中的“联系邮箱(wlsandwho@foxmail.com)”联系我

勿用于学术性引用。

勿用于商业出版、商业印刷、商业引用以及其他商业用途。                

本文不定期修正完善。

本文链接:http://www.cnblogs.com/wlsandwho/p/6716215.html

耻辱墙:http://www.cnblogs.com/wlsandwho/p/4206472.html

=======================================================================

本文讲解了从一个DLL中导出的全局变量,在程序的多个不同DLL中使用时,该变量的行表现。

=======================================================================

Something、UserA、UserB是三个DLL,UserC是一个EXE。

Something在UserA、UserB中被调用,UserC调用了UserA和UserB。

=======================================================================

Something.h

 #pragma once

 #ifdef SOMETHING_EXPORTS
#define SOMETHING_API __declspec(dllexport)
#else
#define SOMETHING_API __declspec(dllimport)
#endif extern SOMETHING_API int nGlobalVarInDLL;

Something.cpp

 #include "stdafx.h"
#include "Something.h" SOMETHING_API int nGlobalVarInDLL = ;

=======================================================================

UserA.h

 #pragma once

 #ifdef USERA_EXPORTS
#define USERA_API __declspec(dllexport)
#else
#define USERA_API __declspec(dllimport)
#endif class USERA_API CUserA
{
public:
void DoSet();
void DoGet();
};

UserA.cpp

 #include "stdafx.h"
#include "UserA.h" #include <iostream> #include "Something.h"
#pragma comment(lib,"Something.lib") void CUserA::DoSet()
{
std::cout <<"In UserA,nGlobalVarInDLL= "<< nGlobalVarInDLL <<" addr= 0x"<<(long)&nGlobalVarInDLL << std::endl;
nGlobalVarInDLL = ;
std::cout << "In UserA,We set nGlobalVarInDLL= " << nGlobalVarInDLL <<std::endl;
} void CUserA::DoGet()
{
std::cout << "In UserA,nGlobalVarInDLL= " << nGlobalVarInDLL << " addr= 0x" <<(long)&nGlobalVarInDLL << std::endl;
}

=======================================================================

UserB.h

 #pragma once

 #ifdef USERB_EXPORTS
#define USERB_API __declspec(dllexport)
#else
#define USERB_API __declspec(dllimport)
#endif class USERB_API CUserB
{
public:
void DoSet();
void DoGet();
};

UserB.cpp

 #include "stdafx.h"
#include "UserB.h" #include <iostream> #include "Something.h"
#pragma comment(lib,"Something.lib") void CUserB::DoSet()
{
std::cout << "In UserB,nGlobalVarInDLL= " << nGlobalVarInDLL << " addr= 0x" << (long)&nGlobalVarInDLL << std::endl;
nGlobalVarInDLL = ;
std::cout << "In UserB,We set nGlobalVarInDLL= " << nGlobalVarInDLL << std::endl;
} void CUserB::DoGet()
{
std::cout << "In UserB,nGlobalVarInDLL= " << nGlobalVarInDLL << " addr= 0x" << (long)&nGlobalVarInDLL << std::endl;
}

=======================================================================

UserC.cpp

 #include "stdafx.h"

 #include "UserA.h"
#pragma comment(lib,"UserA.lib") #include "UserB.h"
#pragma comment(lib,"UserB.lib") int main()
{
CUserA oUserA;
CUserB oUserB; oUserA.DoSet();
oUserB.DoGet(); oUserB.DoSet();
oUserA.DoGet(); return ;
}

=======================================================================

调用结果

=======================================================================

结论就是:使用的是同一个地址空间,加载的是同一个变量。

(这篇就是给那些不想学操作系统知识的人看的。)

DLL导出全局变量在多个DLL中调用的更多相关文章

  1. 在VS2012中采用C++中调用DLL中的函数 (4)

    这两天因为需要用到VS2012来生成一个DLL代码,但是之前并没有用过DLL相关的内容,从昨天开始尝试调试DLL的文件调用,起初笔者在网络上找到了3片采用VSXXX版本进行调试的例子,相关的内容见本人 ...

  2. 【原创】在VS2012中采用C++中调用DLL中的函数(4)

    这两天因为需要用到VS2012来生成一个DLL代码,但是之前并没有用过DLL相关的内容,从昨天开始尝试调试DLL的文件调用,起初笔者在网络上找到了3片采用VSXXX版本进行调试的例子,相关的内容见本人 ...

  3. 在VS2012中采用C++中调用DLL中的函数(4)

    转自:http://www.cnblogs.com/woshitianma/p/3683495.html 这两天因为需要用到VS2012来生成一个DLL代码,但是之前并没有用过DLL相关的内容,从昨天 ...

  4. SEXTANTE中调用任意C++控制台程序的简单例子

    在sextante中单纯利用python或者调用sextante已有算法进行自定义开发,很多情况下速度不咋给力,同样的操作调用QGIS的C++插件比用sextante里的算法要快,有时候快的 还不止一 ...

  5. C#中调用C++的dll的参数为指针类型的导出函数(包括二级指针的情况)

    严格来说这篇文章算不上C++范围的,不过还是挂了点边,还是在自己的blog中记录一下吧. C++中使用指针是家常便饭了,也非常的好用,这也是我之所以喜欢C++的原因之一.但是在C#中就强调托管的概念了 ...

  6. dll的概念 dll导出变量 函数 类

    1. DLL的概念 DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数.变量或类.这些可以直接拿来使用. 静态链接库与动态链接库的区别:   (1)静态链接 ...

  7. DLL的概念、dll导出类(转贴)

    1. DLL的概念DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数.变量或类.这些可以直接拿来使用.静态链接库与动态链接库的区别:(1)静态链接库与动态链 ...

  8. MFC DLL 导出函数的定义方式

    一直在鼓捣DLL,每天的工作都是调试一个一个的DLL,往DLL里面添加自己的代码,但是对于DLL一直不太了解啊!今天一查资料,才发现自己对于DLL编写的一些基本知识也不了解.要学习,这篇文章先总结DL ...

  9. DLL导出函数和类的定义区别 __declspec(dllexport)

    DLL导出函数和类的定义区别 __declspec(dllexport) 是有区别的, 请看 : //定义头文件的使用方,是导出还是导入 #if defined(_DLL_API) #ifndef D ...

随机推荐

  1. java 类方法和实例方法 以及 类变量和实例变量

    类体中的方法分为实例方法和类方法两种,用static修饰的是类方法 类方法: 对于类中的类方法,在该类被加载到内存时,就分配了相应的入口地址.从而类方法不仅可以被类创建的任何对象调用执行,也可以直接通 ...

  2. Ant Design Pro 学习一 安装

    安装: 直接 clone git 仓库 $ git clone --depth=1 https://github.com/ant-design/ant-design-pro.git my-projec ...

  3. 在开发中使用Mockito进行测试

    关于单元测试的一些问题 当我们Javaweb项目中编写单元测试的时候,通常会面临一个普遍的问题:需要测试的类会有很多依赖,而这些依赖的类或者对象又会有很多别的依赖,导致我们在写单元测试的时候几乎需要把 ...

  4. Yarn篇--搭建yran集群

    一.前述 有了上次hadoop集群的搭建,搭建yarn就简单多了.废话不多说,直接来 二.规划 三.配置如下 yarn-site.xml配置 <property>        <n ...

  5. 【转载】Linux下的IO监控与分析

    近期要在公司内部做个Linux IO方面的培训, 整理下手头的资料给大家分享下 各种IO监视工具在Linux IO 体系结构中的位置 源自 Linux Performance and Tuning G ...

  6. [转载]linux修改open files数

    概要:linux系统默认open files数目为1024, 有时应用程序会报Too many open files的错误,是因为open files 数目不够.这就需要修改ulimit和file-m ...

  7. javascript 执行环境细节分析、原理-12

    前言 前面几篇说了执行环境相关的概念,本篇在次回顾下 执行环境(Execution context,简称EC,也称执行上下文 ) 定义了变量或者函数有权访问的数据,决定了各自行为,每个执行环境都有一个 ...

  8. centos perl: symbol lookup error: /usr/local/lib64/perl5/auto/DBD/mysql/mysql.so: undefined symbol: mysql_init

    之前在安装天兔数据库监控工具lepus的时候,运行时一直报perl: symbol lookup error: /usr/local/lib64/perl5/auto/DBD/mysql/mysql. ...

  9. [转]正则匹配时对象必须为string or bytes-like object

    逛segmentfault时碰到这个问题,发现早就在stackoverflow上被解决了. 报错:Expected string or bytes-like object 只需将传递的对象转成字符串就 ...

  10. Linux 内核死锁

    死锁是指多个进程(线程)因为长久等待已被其他进程占有的的资源而陷入阻塞的一种状态.当等待的资源一直得不到释放,死锁会一直持续下去.死锁一旦发生,程序本身是解决不了的,只能依靠外部力量使得程序恢复运行, ...