DLL导出变量

news/2024/7/4 0:49:26
 
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中全局变量本身而不再是其地址了,笔者建议在一切可能的情况下都使用这种方式

http://www.niftyadmin.cn/n/1993239.html

相关文章

【异常】记录“错误: 找不到或无法加载主类 com.iotsoft.back.iotauthority.ApplicationRun”的解决方案

本文目录 一、背景描述 二、报错原因 三、解决方案 方案一&#xff1a;把中文目录改成英文即可 方案二&#xff1a;maven --> install 一、背景描述 今天从 Git 上新 checkout 下来一个项目&#xff0c;运行居然报错。由于代码是别人开发的&#xff0c;我刚接手&#…

【Nginx】记录 nginx 配置文件中 location下根据 ua (user-agent) 判断移动端和电脑端不同浏览器来源

本文目录 一、背景描述 二、问题原因 三、解决方案 一、背景描述 由于已出货的产品上印的有APP软件的下载地址&#xff08;https://www.****.com/a/fwyzc/mrjxz/&#xff09; 的二维码&#xff0c;而这个下载地址是无法改变的&#xff0c;使用手机扫描这个二维码出现web端的…

新疆吐鲁番葡萄为什么这么甜

新疆吐鲁番葡萄为什么这么甜 主要的是:一是新疆纬度高&#xff0c;日照多&#xff0c;光和作用就充分了。 二是昼夜温差大&#xff0c;有利于糖份的积累。 首先吐鲁番地区的土壤适合葡萄的生长习性,再就是气候:日照时间长,干燥,昼夜温差大.干燥的气候能有效的留住葡萄的糖份(…

【mapstruct】Java 中 mapstruct mapper 转换器部分字段转换无效的解决方案

本文目录 一、背景描述 二、问题原因 原因一&#xff1a;映射的字段不一致 原因2&#xff1a;编译问题 三、解决方案 一、背景描述 springboot 2.1.5 mapstruct 1.3.0.Final maven管理工具 接手一个项目&#xff0c;根据需求需要对其接口进行修改&#xff0c;对于两个实…

【工具使用】SecureCRT的下载、安装图文详细过程介绍

本文目录 一、SecureCRT的介绍 二、SecureCRT的下载 三、SecureCRT的安装 四、SecureCRT的使用 一、SecureCRT的介绍 SecureCRT是一款支持SSH&#xff08;SSH1和SSH2&#xff09;的终端仿真程序&#xff0c;简单地说是Windows下登录UNIX或Linux服务器主机的软件。 Secure…

三国志IX修炼统率的方法

三国志9修炼统率的方法 1、统率10&#xff1a; (1)孙子兵法 (统率10 忠诚30 加兵法斗舰) 。通&#xff1a;1-2(孙坚) 3-4(孙策) 5-9(孙权) 10(孙休) 。IF&#xff1a;1-2(孙坚) 3-5(孙策) 6-7(孙权) 8(孙皓) 9(孙权) 10(孙坚) (2)六韬 (统率8 忠诚18 无加兵法) 。通&#…

【异常】com.alibaba.fastjson.JSONException: unclosed string : U

本文目录 一、背景描述 二、错误原因 三、解决方案 一、背景描述 解析 json字符串 时&#xff0c;报如下错误&#xff1a; com.alibaba.fastjson.JSONException: unclosed string : U ....... 二、错误原因 该问题是因为json字符串中含有“\”导致的&#xff0c;如下图所示…

【异常】Feign 调用api模块直接进入fallback的问题解决办法

本文目录 一、背景描述 二、问题原因 三、解决方案 一、背景描述 最近在项目中把服务层的接口封装成了api模块&#xff0c;当其他项目引用了该api模块&#xff0c;调用接口的时候&#xff0c;直接走了fallback&#xff0c;并且没有打印任何异常信息。并且已经在启动类上添加…