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

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

请通过右侧公告中的“联系邮箱(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 jvm 线程 与操作系统线程

    原文链接:http://segmentfault.com/q/1010000000370403 Java的目标是要跨平台,而不同的操作系统(如类Unix和Windows)其任务调度机制有很大的不同,故 ...

  2. Flask快速入门,知识整理

    一.Flask介绍(轻量级的框架,非常快速的就能把程序搭建起来) Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是 ...

  3. (五):C++分布式实时应用框架——微服务架构的演进

    C++分布式实时应用框架--微服务架构的演进 上一篇:(四):C++分布式实时应用框架--状态中心模块 版权声明:本文版权及所用技术归属smartguys团队所有,对于抄袭,非经同意转载等行为保留法律 ...

  4. Python,PyCharm2017安装教程,包含注册码

    一,安装PyCharm 1.下载PyCharm 进入https://www.jetbrains.com/pycharm/download/#section=windows官网下载页面,可以到到PyCh ...

  5. jQuery 属性操作方法(五)

    方法 描述 addClass() 向匹配的元素添加指定的类名. attr() 设置或返回匹配元素的属性和值. hasClass() 检查匹配的元素是否拥有指定的类. html() 设置或返回匹配的元素 ...

  6. [Spark性能调优] 第三章 : Spark 2.1.0 中 Sort-Based Shuffle 产生的内幕

    本課主題 Sorted-Based Shuffle 的诞生和介绍 Shuffle 中六大令人费解的问题 Sorted-Based Shuffle 的排序和源码鉴赏 Shuffle 在运行时的内存管理 ...

  7. J2EE 项目本地发布路径及修改

    J2EE的项目Run on Server后,在tomcat安装目录下的webapps没有出现所建立的工程名字. 很明显项目并没有自动部署到tomcat的webapps中而是部署在了别的容器中. 在内置 ...

  8. linux常用基本命令整理小结

    linux系统遵循的基本原则 由目标单一的小程序组成,组合小程序完成复杂任务: 一切皆文件: 尽量避免捕捉用户接口: 配置文件保存为纯文本文件: Linux命令行常识 命令格式 命令+选项+参数 选项 ...

  9. 关于“System.Data.OleDb.OleDbException,外部数据库驱动程序 (1) 中的意外错误。”的解决方案

    网站之前运行一直很正常,但有一次用户在导入格式为xls的excel文件,发生了错误,跟踪错误后抛出如下的异常: 错误提示: 未处理System.Data.OleDb.OleDbException HR ...

  10. 【转载】从头编写 asp.net core 2.0 web api 基础框架 (4) EF配置

    Github源码地址:https://github.com/solenovex/Building-asp.net-core-2-web-api-starter-template-from-scratc ...