DLL共享数据段,实现多进程数据共享总结

DLL共享数据段 全局变量在DLL内使用,在同一进程同一DLL文件中的相互调用是正常的,包括指针的使用;不同进程中参数互不影响。 当C#启动后开始加载DLL文件,文件中的初始代码就会执行,所有全局变量会一直保存实值,直到C#程序运行结束或主动释放加载的DLL文件,这样DLL文件就可以被看作一个伴随C#主进程一直运行的子线程,运行过程中不会释放变量. 默认情况下,同一个程序启动多个进程,它们各自的变量值是不会相互影响的。第二个实例启动后,在修改全局变量的时候,系统会运用内存管理系统copy- on-write的特性来防止修 阅读详情

    前段时间一直用WM_COPYDATA消息实现进程数据通信,这次软件升级想学习一下,DLL共享数据段应用,因为这个比共享内存简单一些,向VCKBASE前辈请教了很多,最后明白了下面的点滴

问题简述

假想通过DLL实现进程数据共享?

实现

第一步:在DLL的.CPP文件中定义共享数据段

#pragma data_seg("SHARED_OPCDATASET")

/* volatile */ OPCDATASET  m_gOPCDATASET[OPCDATASET_MAX_LEN] = {0};

#pragma data_seg()

#pragma comment(linker,"/SECTION:SHARED_OPCDATASET,RWS")

 

/*

如果没有初始化可尝试执行下面的操作

 _declspec(allocate("SHARED_OPCDATASET")) OPCDATASET m_gOPCDATASET[OPCDATASET_MAX_LEN];

*/

第二步:将共享段变量导出

extern  "C"

{

//导出共享段变量

OPCDATASET_API OPCDATASET extern m_gOPCDATASET[OPCDATASET_MAX_LEN];

}

第三步:在不同进程中调用

#include "OPCDataSet.h"

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

      //A进程: 向共享段写数据

char OPCDataBuffer[56] = {0};

m_gOPCDATASET[0].dVal = FormatVarVal(pVar, OPCDataBuffer);

FILE * fp = fopen("d://Set.txt", "a");

fprintf(fp, "%f", m_gOPCDATASET[0].dVal);

fclose(fp);

      //B进程: 从共享段读数据

FILE * fp = fopen("D://get.txt", "a");

fprintf(fp, "%f", m_gOPCDATASET[0].dVal);

fclose(fp);

注:这些进程最好是与你的DLL放于同一目录下,或将你的DLL放入system32目录下

精彩指导选编:

回复人: vc_student (进士)  2009-8-19 9:45:56

可以通过dll导出一个函数专门操作共享内存呀!

只有一个进程对这个空间进行写操作,其它多个进程是只读,还用做同步吗?

回复人: vc_student (进士)  2009-8-19 9:50:28

要不写到一半别人去读怎么办?

回复人: 幸福的鬼 (书童)  2009-8-19 10:03:57

同步处理是肯定要的,但是关键代码段是不能跨进程的!!!

回复人: vc_student (进士)  2009-8-19 10:04:29

哈,想起来了,关键代码段好像不支持多进程?

回复人: vc_student (进士)  2009-8-19 10:09:46

可以使用互斥对象和事件对象

回复人: folklore (进士)  2009-8-19 10:34:26 

因为你根本就没有真正共享,要真的共享,请使用Mmap,谢 谢

回复人: 幸福的鬼 (书童)  2009-8-19 10:39:59 

这样的软件设计,强

对共享段的访问应该封装在DLL内部,才是比较好的设计

 

如何编写线程安全的DLL 在我的工作中经常会编写DLL,这些DLL有个共同的特点就是都有一个初始化函数,一个资源释放函数,其他几个函数都是核心功能函数。而且这些DLL有时会被多个进程同时调用,这就牵扯到多进程的多线程调用DLL的问题。有点绕口,以下我根据我实践中遇到的问题,分四种情况分享一下我解决此类问题的经验:1、动态库只有一个导出函数。这种情况非常少,也是最容易处理的情况。这种情况下编写函数时,只需要考虑不要有 阅读详情

相关推荐

动态调用DLL并与主程序通信,内存共享,线程安全

动态调用DLL并与主程序通信,内存共享,线程安全。@Patek。

dll共享段中一些需要注意的问题

VisualC++ 如何与应用程序或其他DLL共享自己DLL中的数据? Win32DLL映射到调用进程的地址空间中。默认情况下,每个使用DLL的进程都有自己的所有DLL全局变量和静态变量的实例。如果DLL需要与它的由其他应用程序加载的其他实例共享数据,则可使用下列方法之一: 使用data_seg杂注创建命名数据节。 使用内存映射文件。请参见有关内存映射文件的...

weixin_34184158的博客 338

不用SE63逐个翻译!ABAP函数LXE_OBJ_TEXT_PAIR_WRITE批量处理TCODE描述的3种姿势

本文介绍了三种利用ABAP函数LXE_OBJ_TEXT_PAIR_WRITE批量翻译SAP事务码(TCODE)描述的高效方案,旨在替代SE63逐个翻译的低效操作。内容涵盖从基础循环、Excel导入到全自动程序集成的实现方法,帮助开发者显著提升批量翻译效率,并深入解析了SAP翻译体系的核心原理与实战技巧。

weixin_42593130的博客 659

DLL动态链接库共享数据段的问题

#pragma comment(linker, "/section:.shareseg,rws") 加入这行预编译指令可以使指定的段.shareseg加上read,write, share属性,即读写共享,在这个数据段中的数据,在所有加载该dll的进程内共享。 今天在使用的时候发现一个问题,如果在"/section:.shareseg,rws"这段.shareseg,后面加上一个空格的话,即这

nbabn的专栏 1049

Drupal远程代码执行漏洞(CVE-2018-7600)实战复现:从检测到写入WebShell的全过程

本文详细解析了Drupal远程代码执行漏洞(CVE-2018-7600)的实战复现过程,从环境搭建、漏洞检测到WebShell写入的全流程。该高危漏洞影响Drupal 6.x至8.x版本,允许攻击者未经授权执行任意代码。文章提供了多种POC构造方法和高级利用技巧,帮助安全研究人员深入理解漏洞原理并掌握验证技术。

weixin_29322553的博客 275

Windows系统下复现PointNet++算法

本文详细介绍了如何在Windows系统下复现PointNet++算法,内容包括程序下载、环境配置、数据集准备以及三个主要任务(语义分割、分类、部件分割)的实现步骤和常见报错解决方法。通过遵循本文的指导,用户可以顺利完成PointNet++算法的复现。

LingYi_5的博客 4326

linux动态链接库全局变量共享问题&DLL共享数据段

Linux写时拷贝技术(copy-on-write) 进程间是相互独立的,其实完全可以看成A、B两个进程各自有一份单独的liba.so和libb.so,相应的动态库的代码段和数据段都是各个进程各自有一份的。 然后在这个基础上,由于代码段是不会被修改的,所以操作系统可以采用copy on write的优化技术,让两个进程共享同一份物理内存。这是属于在不改变系统行为的基础上,为了节省内存,

zxh821112的专栏 3万+

2026AI漫剧放心大胆做!小白也能轻松出片(附保姆级教程)

要是在2025,我大概率会劝他再等等,毕竟那时工具还没这么顺手。但到了2026年的今天,我的回答得很干脆:放心去做,绝对没问题。这一年多来,AI漫剧这块的变化真可谓翻天覆地。过去你想拍个像样的短片,哪怕再简陋,也得凑齐拍摄设备、找场地、找演员,后期剪辑更是折磨。但现在,时代变了,AI已经把创作的门槛踏平了。你不需要请演员,也不用操心灯光布景,更不用为剪辑特效烧钱。一个人,一台电脑,花几天时间就能做一部完整的AI漫剧。你只要有有想表达的故事,突发的灵感,剩下的,都能直接交给AI落地。

欢迎来到鸾姝淡月博客,专为程序员和编程爱好者打造的技术博客。我们分享编程语言趋势、开发工具、编程哲学、职业发展等,助你掌握新技术,优化技能,激发编程热情。 471

检测程序运行实例个数

共享数据段 方式 在.cpp文件开头加上以下几行: #pragma data_seg("Shared") int volatile g_lAppInstance =0; #pragma data_seg() #pragma comment(linker,"/section:Shared,RWS") 我们来看一下上面的内容: 第一句 #pragma data_seg("Shared")

Alsmile的专栏 1156

物理AI重构自动驾驶供应链 | 传统Tier1盈利模式崩塌,纯算法/软硬一体双路线落地对比,助力智驾软件商业化与全场景模型迭代

2026年是自动驾驶物理AI规模化落地元年,行业彻底告别传统感知-预测-规划-控制的模块化分层开发范式,迈入以世界模型、物理规则推演、端到端动作生成为核心的全新技术阶段。不同于传统AI仅完成图像识别、目标检测的浅层感知任务,物理AI能够深度理解道路交通中的动力学约束、路面摩擦、车辆博弈、行人运动规律等真实物理逻辑,实现对复杂路况的时序推演与自主决策,从底层重构自动驾驶技术架构。技术迭代同步引发产业链颠覆性变革,沿用数十年的传统自动驾驶Tier1商业模式全面崩塌。

getusushu的博客 288

LangGraph 中 Human-in-the-loop

摘要:本文探讨了在自主AI Agent系统中实现"人工介入关键节点"(HIL)的技术方案,主要基于LangGraph框架构建。针对Agent可能执行高风险操作(如删除数据库)的问题,提出通过断点机制在关键节点暂停流程,实现人工审批后再继续执行。具体实现包括:(1)使用checkpointer组件持久化状态;(2)通过interrupt_before/after参数设置断点;(3)支持三种交互模式:批准、编辑和输入。文章还提供了代码示例,展示如何在不同场景(如工具调用)中动态触发人工审核机

qq_52053775的博客 153

多个进程范文DLL中的函数/全局变量/数据共享段问题

转载请标明是引用于 http://blog.youkuaiyun.com/chenyujing1234  第一种方法:数据段共享#pragma data_seg 一、 #pragma data_seg() 1,#pragma data_seg()一般用于DLL中。也就是说,在DLL中定义一个共享的,有名字的数据段。最关键的是:这个数据段中的全局变量可以被多个进程共享。 否则多个进程之间无法共享DLL

xuyuefei1988的专栏 5261

Cadence SPB16. 6 安装流程

1.首先下载CadenceAllegroSPBorCAD16.6安装包 下载之后运行其中的setup.exe,然后先安装第一项LicenseManager 一直按next或install, 直到被询问license时,单击cancel,然后选是和finish。 2,安装Product Installtion 直接点next跳过这一步 安装完成后,点Exit退出 3.按ctrl+alt+delete打开任务管...

wangjie36的博客 5148

DLL共享全局数据变量

DLL入门浅析(5)——使用DLL在进程间共享数据 http://www.cppblog.com/suiaiguo/archive/2009/07/21/90734.html              在Win16环境中,DLL的全局数据对每个载入它的进程来说都是相同的,因为所有的进程用的都收同一块地址空间;而在Win32环境中,情况却发生了变 化,每个进程都有了它自己的地址空间,...

gnote 2094

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

使用DLL在进程间共享数据

DLL入门浅析(5)——使用DLL在进程间共享数据          在Win16环境中,DLL的全局数据对每个载入它的进程来说都是相同的,因为所有的进程用的都收同一块地址空间;而在Win32环境中,情况却发生了变化,每个进程都有了它自己的地址空间,DLL函数中的代码所创建的任何对象(包括变量)都归调用它的进程所有。当进程在载入DLL时,操作系统自动把DLL地址映射到该进程的私有空间,也就是

Nancy_m的专栏 1529

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

DLL共享数据

在Win16环境中,DLL的全局数据对每个载入它的进程来说都是相同的,因为所有的进程用的都收同一块地址空间;而在Win32环境中,情况却发生了变化,每个进程都有了它自己的地址空间,DLL函数中的代码所创建的任何对象(包括变量)都归调用它的进程所有。当进程在载入DLL时,操作系统自动把DLL地址映射到该进程的私有空间,也就是进程的虚拟地址空间,而且也复制该DLL的全局数据的一份拷贝到该进程空间。(在

jackey3Lin的专栏 856

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

动态库so/dll 数据共享

https://www.cnblogs.com/shijingjing07/p/5606930.html http://pnxio.iteye.com/blog/2204451 https://bbs.pediy.com/thread-99734.htm 1.什么是DLL DLL,即动态链接库,是包含若干个函数的库文件,可供其他程序运行时调用。 2.DLL的优缺点 优点:代码重用,

lxz26192的专栏 1291

使用DLL在进程间共享内存_如何在多进程中用共享DLL

共享数据DLL允许进程以类似于Windows 3.1 DLL共享数据的方式访问读写数据,多个进程都可以对该共享数据DLL进行数据操作,达到共享数据的目的。在WIN32中为建立共享内存,必须执行以下步骤: 首先创建一个有名的数据区。这在Visual C++中是使用data_seg pragma宏。使用data_seg pragma宏必须注意数据的初始化: #pragma data_seg("MYSE

飞翔的专栏 5902

同一个dll被多个进程使用的数据共享(Data_seg)

同一个dll被多个进程使用的时候,在大多数情况下,各个进程使用dll和独自使用dll效果是相同的。 因为对于dll中的局部变量是写入到进程的堆栈中的,全局变量也被操作系统为每个线程copy一份各自使用。 you can use either of the following approaches: · Create named data sections using the data_seg pragma. · Use memory mapped files. See t

春夜喜雨的专栏 6150

DLL入门浅析 - 多进程加载DLL内存模型

DLL入门浅析(5)——使用DLL在进程间共享数据          在Win16环境中,DLL的全局数据对每个载入它的进程来说都是相同的,因为所有的进程用的都收同一块地址空间;而在Win32环境中,情况却发生了变化,每个进程都有了它自己的地址空间,DLL函数中的代码所创建的任何对象(包括变量)都归调用它的进程所有。当进程在载入DLL时,操作系统自动把DLL地址映射到该进程的私有空间,也就是

zhang_sinner的专栏 2570

Windows中使用DLL在进程间共享数据

在Win16环境中,DLL的全局数据对每个载入它的进程来说都是相同的,因为所有的进程用的都收同一块地址空间;而在Win32环境中,情况却发生了变化,每个进程都有了它自己的地址空间,DLL函数中的代码所创建的任何对象(包括变量)都归调用它的进程所有。当进程在载入DLL时,操作系统自动把DLL地址映射到该进程的私有空间,也就是进程的虚拟地址空间,而且也复制该DLL的全局数据的一份拷贝到该进程空间。(在

1736
上一篇: 需要DLL函数输出的结果信息,尽量使用传入参数做为输出变量~!
下一篇: 为什么向VS6.0拖放 .dsp工程文件时,系统提示:
PerfectToday
博客等级 码龄18年 46粉丝 129原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值