Windows核心编程——进程间通信之dll共享段

 使用dll共享数据段在进程中进行通信

  在多个进程间共享数据,windows提供了这种方法,就是创建自己的共享数据节,并将需要共享的变量放入该内存中。如果是在相同程序的多个实例间共享数据,只要在exe文件创建共享节即可,否则就需要在DLL中创建共享节,其它进程加载该DLL来共享数据。
  在Win32环境下要想在多个进程中共享数据,就必须进行必要的设置。在访问同一个Dll的各进程之间共享存储器是通过存储器映射文件技术实现的。也可以把这些需要共享的数据分离出来,放置在一个独立的数据段里,并把该段的属性设置为共享。必须给这些变量赋初值,否则编译器会把没有赋初始值的变量放在一个叫未被初始化的数据段。

 

方法:

  a.  在dll中开辟一段空间, 用来存放共享的数据
  b. 将这段空间的属性设为 可读可写可共享

 

实例:

1) 在dll中开辟一段空间, 用来存放共享的数据

  创建一个dll->在DLL的实现文件中添加下列代码:

    shareDll.h下:

1
2
extern SHAREDLL_API int nshareDll;
extern SHAREDLL_API DWORD g_dwValue;

    shareDll.cpp下:

1
2
3
#pragma data_seg("shared")             //空间的开始
SHAREDLL_API DWORD g_dwValue = 0x87654093;
#pragma data_seg()                      //空间的结束

      

2) 将这段空间的属性设为 可读可写可共享

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

 

 测试usedll:
  

创建对话框,添加读写按钮和事件,填入代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include"..\shareDll\shareDll.h"
#pragma comment(lib,"..\\debug\\sharedll.lib")
 
void CUseDllDlg::OnBnClickedRead()
{
    SetDlgItemInt(EDT_READ, g_dwValue);
}
 
 
void CUseDllDlg::OnBnClickedWrite()
{
    g_dwValue = GetDlgItemInt(EDT_WRITE);
}

 
    写入dll的值读的还是写入的值(操作同变量值):

 

 

 

    测试共享更多数组:
    
    CreatDll:

1
2
3
4
5
6
7
8
extern SHAREDLL_API int nshareDll;
extern SHAREDLL_API DWORD g_dwValue;
extern SHAREDLL_API char g_aryTest[0x1000];
 
#pragma data_seg("shared")             //空间的开始
SHAREDLL_API DWORD g_dwValue = 0x87654093;
char g_aryTest[0x1000] = { 0 };
#pragma data_seg()           //空间的结束

 
    UseDll:

1
2
3
4
5
6
7
8
9
10
11
12
void CUseDllDlg::OnBnClickedRead()
{
    SetDlgItemText(EDT_READ, g_aryTest);
}
 
 
void CUseDllDlg::OnBnClickedWrite()
{
    CString str;
    GetDlgItemText(EDT_WRITE, str);
    memcpy(g_aryTest, str.GetBuffer(0), str.GetLength() + 1);
}

 

测试:

 

 

共享成功
PS:对象也可以共享,但要构造初始化。

 

注意:

1) #pragma comment(linker,"/SECTION:cr36_shared,RWS")中不要有空格。

2) 共享的数据必须初始化, 否则共享失败。

 

posted @   Wings_shadow  阅读(1727)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示