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

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

请通过右侧公告中的“联系邮箱(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. Q:记学习枚举过程中的一个小问题

    在学习有关java枚举的时候,我们知道了所有的枚举类型均是继承自java.lang.Enum类的,且所有的枚举常量均是该枚举类型的一个对象,且对象名即为该枚举常量的名称.例子如下:源码: public ...

  2. powerdesigner的使用

    前言 做过建模和设计的人都知道,powerdesigner是个强大实用的工具:采用模型驱动方法,将业务与IT结合起来,可帮助部署有效的企业体系架构,并为研发生命周期管理提供强大的分析与设计技术.本文档 ...

  3. .net 框架

    目录 API 应用框架(Application Frameworks) 应用模板(Application Templates) 人工智能(Artificial Intelligence) 程序集处理( ...

  4. leetcode — reorder-list

    /** * Source : https://oj.leetcode.com/problems/reorder-list/ * * Given a singly linked list L: L0→L ...

  5. JavaScript 计算指定月份有多少天

    用 js 画工作日历的时候,需要用 js 计算指定月份一共有多少天 在网上找了些方法,都比较繁琐,后来灵机一动,想到一个偷懒的办法,分享一下 一.原理分析 要想得到某月有多少天,只需要获取到当月最后一 ...

  6. ActiveMQ进阶学习

    本文主要讲述ActiveMQ与spring整合的方案.介绍知识点包括spring,jms,activemq基于配置文件模式管理消息,消息监听器类型,消息转换类介绍,spring对JMS事物管理. 1. ...

  7. 【读书笔记】【深入理解ES6】#2-字符串和正则表达式

    更好的Unicode支持 在ES6出现以前,JS字符串一直基于16位字符编码(UTF-16)进行构建. 每16位的序列是一个编码单元(code unit),代表一个字符. length.charAt( ...

  8. Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

    方法的重写Overriding和重载Overloading是Java多态性的不同表现.重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现.如 ...

  9. springboot 静态方法注入service

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; line-height: 16.0px; font: 14.0px Arial; color: #3f3f3f; bac ...

  10. 内核知识第八讲,PDE,PTE,页目录表,页表的内存管理

    内核知识第八讲,PDE,PTE,页目录表,页表的内存管理 一丶查看GDT表. 我们通过WinDbg + 虚拟机可以进行双机调试.调试一下看下GDT表 我们知道,GDT表中.存储的是存储段信息. 保存了 ...