0x01 DLL在进程间共享数据理论

  1.可以在Dll中使用#pragma data_seg建立共享类型的数据段将需要共享的数据分离出来,放置在一个独立的数据段里,并把该段的属性设置为共享,从而实现不同进程的数据共享。并且必须给这些变量赋初值,否则编译器会把没有赋初始值的变量放在一个叫未被初始化的数据段中。

#pragma data_seg("SHARED")   //建立数据段,这里命名为SHARED
char __ShareData[MAX_PATH] = "我是共享数据型蜻蜓队长 OVER~(dll)"; //对变量进行专门的初始化是必需的,否则编译器将把它们放在普通的未初始化数据段中而不是放在shared中,那样的话就无法实现共享数据了
#pragma data_seg() //标示段的结束
#pragma comment(linker,"/SECTION:SHARED,RWS") //指定链接选项 //RWS表示段具有读、写和共享属性

  

  2.函数导出方式 extern "C" __declspec(dllexport) 和 _declspec(dllexport) 的区别

  使用extern "C" __declspec(dllexport)声明导出函数,在DLL中的函数名字保持与导出函数名一致。使用__declspec(dllexport)声明导出函数,在DLL中的函数名字与导出函数名字不一致,有变化。这些差异主要是使用C方式函数C++方式编译导致的。

所以,在使用GetProcAddress( HMODULE hModule, LPCWSTR lpProcName)函数查找导出函数时,最好在DLL中用extern "C" __declspec(dllexport)声明导出函数。

   _declspec(dllexport)导出方式的函数名:

   extern "C" __declspec(dllexport) 导出方式对比:

0x02  程序结果和源代码

     共享段数据被Test1进程修改后被test2进程读取到:

  源代码:

 // Dll.cpp : 定义 DLL 应用程序的导出函数。
// #include "stdafx.h"
#include <iostream>
#include <windows.h>
using namespace std; char __BufferData[MAX_PATH] = "我是蜻蜓队长 OVER~(dll)"; #pragma data_seg("SHARED") //建立数据段,这里命名为SHARED
char __ShareData[MAX_PATH] = "我是共享数据型蜻蜓队长 OVER~(dll)"; //对变量进行专门的初始化是必需的,否则编译器将把它们放在普通的未初始化数据段中而不是放在shared中,那样的话就无法实现共享数据了
#pragma data_seg() //标示段的结束
#pragma comment(linker,"/SECTION:SHARED,RWS") //指定链接选项 //RWS表示段具有读、写和共享属性 extern CRITICAL_SECTION __CriticalSection;
_declspec(dllexport)
char* GetBufferData()
{
return __BufferData;
} _declspec(dllexport)
void SetBufferData(char* BufferData,int BufferLength)
{
__try
{
memcpy(__BufferData, BufferData, BufferLength);
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
printf("异常\r\n"); return;
}
} //声明为导出函数
_declspec(dllexport)
char* GetShareData()
{
return __ShareData;
} _declspec(dllexport)
void SetShareData(char* BufferData, int BufferLength)
{ EnterCriticalSection(&__CriticalSection);
__try
{
memcpy(__ShareData, BufferData, BufferLength);
}
__except (EXCEPTION_EXECUTE_HANDLER)
{ printf("异常\r\n");
} LeaveCriticalSection(&__CriticalSection);
return;
} extern "C" __declspec (dllexport)
void Sub_1()
{ }
_declspec(dllexport)
void Sub_2()
{ }

dll.cpp

使用DLL在进程间共享数据的更多相关文章

  1. DLL入门浅析(5)——使用DLL在进程间共享数据

    转载自:http://www.cppblog.com/suiaiguo/archive/2009/07/21/90734.html 在Win16环境中,DLL的全局数据对每个载入它的进程来说都是相同的 ...

  2. 【转】VC 利用DLL共享区间在进程间共享数据及进程间广播消息

    1.http://blog.csdn.net/morewindows/article/details/6702342 在进程间共享数据有很多种方法,剪贴板,映射文件等都可以实现,这里介绍用DLL的共享 ...

  3. 【C++】DLL内共享数据区在进程间共享数据(重要)

    因项目需要,需要在DLL中共享数据,即DLL中某一变量只执行一次,在运行DLL中其他函数时该变量值不改变:刚开始想法理解错误,搜到了DLL进程间共享数据段,后面发现直接在DLL中定义全局变量就行,当时 ...

  4. python 进程间共享数据 (二)

    Python中进程间共享数据,除了基本的queue,pipe和value+array外,还提供了更高层次的封装.使用multiprocessing.Manager可以简单地使用这些高级接口. Mana ...

  5. 使用 WM_COPYDATA 在进程间共享数据

    开发中有时需要进程间传递数据,比如对于只允许单实例运行的程序,当已有实例运行时,再次打开程序,可能需要向当前运行的实例传递信息进行特殊处理.对于传递少量数据的情况,最简单的就是用SendMessage ...

  6. 进程间共享数据Manager

    一.前言 进程间的通信Queue()和Pipe(),可以实现进程间的数据传递.但是要使python进程间共享数据,我们就要使用multiprocessing.Manager. Manager()返回的 ...

  7. windows核心编程之进程间共享数据

    有时候我们会遇到window进程间共享数据的需求,例如说我想知道系统当前有多少某个进程的实例. 我们能够在程序中定义一个全局变量.初始化为0.每当程序启动后就加1.当然我们我们能够借助第三方介质来储存 ...

  8. Python multiprocessing.Manager介绍和实例(进程间共享数据)

    Python中进程间共享数据,处理基本的queue,pipe和value+array外,还提供了更高层次的封装.使用multiprocessing.Manager可以简单地使用这些高级接口. Mana ...

  9. Swoole 中使用 Table 内存表实现进程间共享数据

    背景 在多进程模式下进程之间的内存是相互隔离的,在一个工作进程中的全局变量和超全局变量,在另一个工作进程中是无法读取和操作的. 如果只有一个工作进程,则不存在进程隔离问题,可以使用全局变量和超全局变量 ...

随机推荐

  1. 雷林鹏分享:jQuery EasyUI 树形菜单 - 创建带复选框的树形菜单

    jQuery EasyUI 树形菜单 - 创建带复选框的树形菜单 easyui 的树(Tree)插件允许您创建一个复选框树.如果您点击一个节点的复选框,这个点击的节点信息将向上和向下继承.例如:点击 ...

  2. 智能合约语言 Solidity 教程系列10 - 完全理解函数修改器

    这是Solidity教程系列文章第10篇,带大家完全理解Solidity的函数修改器. Solidity系列完整的文章列表请查看分类-Solidity. 写在前面 Solidity 是以太坊智能合约编 ...

  3. P2469 [SDOI2010]星际竞速

    在何Au的讲解下终于搞明白了这个以前的坑. 首先考虑最小路径覆盖. 这个题意又要求我们求出的最大流为n-1(这样才能保证路径为1条) 考虑高速航行模式的图怎么建,只需要保证最大流的同时费用最小即可,显 ...

  4. Tempter of the Bone HDU - 1010

    The doggie found a bone in an ancient maze, which fascinated him a lot. However, when he picked it u ...

  5. CentOS7.3环境下源码安装httpd

    CentOS7.3环境下源码安装httpd 本文在CentOS7.3下,源码安装apache服务httpd2.4. 1.下载好源码安装包 [root@localhost ~]#ll total 625 ...

  6. Linux系统中文件定位与查找

    Linux系统中文件查找 关键词 文件查找 | find | locate 本文主要介绍有关文件查找的两个命令——find和locate,以及压缩打包的命令——compress, gzip,bzip2 ...

  7. python记录_day07

    一.基本数据类型补充 1.列表的拼接用join()方法 li = ["hello","world"] s = "_".join(li) pr ...

  8. 『MXNet』专题汇总

    MXNet文档 MXNet官方教程 持久化模型 框架介绍 『MXNet』第一弹_基础架构及API 『MXNet』第二弹_Gluon构建模型 『MXNet』第三弹_Gluon模型参数 『MXNet』第四 ...

  9. 【MySQL】【4】数据库时间与实际时间相差8小时

    原因:由于默认的是UTC时间,所以在中国有8个小时的时差,需要将serverTimezone的值改为GMT%2B8 spring: datasource: url: jdbc:mysql://172. ...

  10. Vue引入jQuery

    1.在项目中安装jquery npm install jquery --save-dev 或者 打开package.json文件,在里面加入这行代码,jquery后面的是版本,根据你自己需求更改. d ...