`
conkeyn
  • 浏览: 1523582 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

DLL导出变量

阅读更多

DLL定义的全局变量可以被调用进程访问;DLL也可以访问调用进程的全局数据,我们来看看在应用工程中引用DLL中变量的例子(单击此处下载本工程附件 )。

/* 文件名:lib.h */

#ifndef LIB_H

#define LIB_H

extern int dllGlobalVar;

#endif


/* 文件名:lib.cpp */

#include "lib.h"

#include <windows.h>


int dllGlobalVar;


BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)

{

switch (ul_reason_for_call)

{

case DLL_PROCESS_ATTACH:

dllGlobalVar = 100; //在dll被加载时,赋全局变量为100

break;

case DLL_THREAD_ATTACH:

case DLL_THREAD_DETACH:

case DLL_PROCESS_DETACH:

break;

}

return TRUE;

}


;文件名:lib.def

;在DLL中导出变量

LIBRARY "dllTest"

EXPORTS

dllGlobalVar CONSTANT

;或dllGlobalVar DATA

GetGlobalVar


  从lib.h和lib.cpp中可以看出,全局变量在DLL中的定义和使用方法与一般的程序设计是一样的。若要导出某全局变量,我们需要在.def文件的EXPORTS后添加:

变量名 CONSTANT   //过时的方法


  或

变量名 DATA     //VC++提示的新方法

在主函数中引用DLL中定义的全局变量:

#include <stdio.h>

#pragma comment(lib,"dllTest.lib")

extern int dllGlobalVar;

int main(int argc, char *argv[])

{

printf("%d ", *(int*)dllGlobalVar);

*(int*)dllGlobalVar = 1;

printf("%d ", *(int*)dllGlobalVar);


return 0;

}


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

dllGlobalVar = 1;


  其结果是dllGlobalVar指针的内容发生变化,程序中以后再也引用不到DLL中的全局变量了。

  在应用工程中引用DLL中全局变量的一个更好方法是:

#include <stdio.h>

#pragma comment(lib,"dllTest.lib")

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

int main(int argc, char *argv[])

{

printf("%d ", dllGlobalVar);

dllGlobalVar = 1; //这里就可以直接使用, 无须进行强制指针转换

printf("%d ", dllGlobalVar);

return 0;

}


  通过_declspec(dllimport)方式导入的就是DLL中全局变量本身而不再是其地址了,笔者建议在一切可能的情况下都使用这种方式。

分享到:
评论

相关推荐

    如何从DLL中导出接口+类+变量的完整工程

    // DLL导出变量 __declspec(dllexport) extern int g_GlobalValue; // DLL实现 int g_GlobalValue = 0; // 客户端程序 extern __declspec(dllimport) int g_GlobalValue; // 导入变量 ``` ### 静态和动态方法 在...

    dll中导出变量,以及测试程序

    本文将深入探讨如何在DLL中导出变量,并创建一个测试程序来验证其正确性。我们以标题中的"mydll2"为例,它是一个可能包含导出变量的DLL。 首先,让我们了解如何在DLL中导出变量。导出变量的过程通常涉及以下几个...

    深入浅出Visual C++动态链接库(DLL)编程(pdf版+doc版)

    2.6、DLL导出变量 2.7、DLL导出类 第三章:VC++动态链接库编程之MFC规则DLL 5.1 概述 5.2 MFC规则DLL的创建 5.3 一个简单的MFC规则DLL 5.4 MFC规则DLL的调用 5.5 共享MFC DLL的规则DLL的模块切换 第四章:VC++动态...

    DLL编程深入浅出带源码

    4.6 DLL导出变量 4.7 DLL导出类 5. MFC规则DLL 5.1 概述 5.2 MFC规则DLL的创建 5.3 一个简单的MFC规则DLL 5.4 MFC规则DLL的调用 5.5 共享MFC DLL的规则DLL的模块切换 6.1 MFC扩展DLL的创建 6.2 MFC扩展DLL的调用 6.3...

    MFC的DLL导出类

    "MFC的DLL导出类" 本文主要介绍了如何使用MFC扩展DLL来导出类的方法,包括创建MFC扩展DLL的步骤、建立输出类、创建窗口类DLL、编译DLL、建立DLL测试程序等。 MFC扩展DLL是指使用MFC框架创建的动态链接库,可以提供...

    dll导出导入宏定义使用总结

    ### DLL导出与导入宏定义使用总结 #### 引言 动态链接库(Dynamic Link Library,简称DLL)是Windows系统中的一个重要组成部分,广泛应用于软件开发过程中。通过DLL,可以实现代码及数据的共享,提高软件的运行...

    VC 中的DLL介绍

    非MFC DLL 7 4.1一个简单的DLL 7 4.2 声明导出函数 11 4.3 DLL的调用方式 12 4.4 DllMain函数 14 4.5 __stdcall约定 18 4.6 DLL导出变量 19 4.7 DLL导出类 23 5. MFC规则DLL 32...

    易语言输出DLL导出表源码.7z

    "易语言输出DLL导出表源码.7z" 是一个压缩包,包含有关如何在易语言中创建动态链接库(DLL)并输出其导出表的源代码。DLL是Windows操作系统中的一个重要组件,它能实现代码和资源的共享,减少内存占用,提高程序运行...

    dll导出lib必备神器组合

    在标题中提到的"dll导出lib必备神器组合",实际上是指利用两个工具——`pexports`和`lib`,来实现DLL到静态库的转换。`pexports`是一个命令行工具,用于从DLL中导出函数定义,生成.DEF文件。`.DEF`文件是Windows下的...

    MFC扩展DLL导出对话框类

    本文将详细讲解如何在MFC环境中创建一个扩展DLL,并导出一个对话框类,以便在其他应用程序中使用。我们将遵循以下步骤进行操作: 1. **创建MFC扩展DLL项目** 首先,我们需要在Visual Studio中创建一个新的MFC扩展...

    编写DLL导出类

    "编写DLL导出类"是创建DLL时的关键步骤,它涉及到如何设计和实现DLL的核心功能,并提供一个清晰、稳定的接口供其他程序调用。下面我们将深入探讨这个主题。 1. **DLL的基础概念** - DLL是Windows操作系统中的一个...

    dllexp DLL导出函数查看器

    《dllexp DLL导出函数查看器:深入理解DLL与导出函数》 在Windows操作系统中,DLL(Dynamic Link Library)是一种重要的共享库机制,它允许多个程序共享同一段代码和数据,从而节省内存资源、简化软件开发和维护。...

    dll编程深入浅出含代码-个人整合

    4. **dll编程深入浅出之4.7 DLL导出类代码.zip** 和 **dll编程深入浅出之4.6 DLL导出变量代码.zip**:这两个部分分别展示了如何在DLL中导出类和变量。导出类允许其他程序实例化DLL中的对象,而导出变量则让其他程序...

    【cmake实战十】c++从动态库(dll)导出类

    C++从DLL导出类涉及到两个主要步骤:定义导出标志和编写DLL及客户端代码。 1. 定义导出标志: 在C++中,我们需要为DLL接口定义一个特定的宏,用于标记哪些是对外可见的。通常有两种方法: - 使用`__declspec(dll...

    dll中导出函数,以及测试程序

    首先,我们要了解什么是DLL导出函数。DLL导出函数是DLL文件中可供其他应用程序或DLL调用的函数。当开发DLL时,我们需要明确哪些函数或变量是对外公开的,这通常通过在源代码中使用`__declspec(dllexport)`关键字或者...

    C++ 导出dll接口函数 C++ 导出dll接口函数 C++ 导出dll接口函数

    可以通过设置环境变量或使用`SetDllDirectory` API来指示系统搜索DLL的路径。另外,需要使用`LoadLibrary`函数加载DLL,并使用`GetProcAddress`获取函数地址。 5. **卸载DLL**:当不再需要DLL时,应使用`...

    ha-exescope650-moming.rar_dll导出_查看DLL

    《深入理解DLL导出与查看:以HA-eXeScope650-moming为例》 在计算机编程领域,动态链接库(DLL)是Windows操作系统中一个重要的组件,它允许多个程序共享同一段代码和数据,从而节省内存并提高效率。然而,对DLL的...

    深入浅出VC++动态链接库_DLL_编程

    ##### 4.6 DLL导出变量 除了导出函数外,还可以导出全局变量或静态变量。例如: ```cpp extern "C" __declspec(dllexport) int g_myVar = 0; ``` ##### 4.7 DLL导出类 导出类时需要注意构造函数和析构函数的处理...

Global site tag (gtag.js) - Google Analytics