首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >通过dll的跨进程通讯

通过dll的跨进程通讯

原创
作者头像
Qwe7
发布2022-03-27 08:06:29
发布2022-03-27 08:06:29
8960
举报
文章被收录于专栏:网络收集网络收集

共享数据段

在dll中使用 #pragma data_seg() 可以创建一个共享数据段

代码语言:javascript
复制
#pragma data_seg("SharedMemory")
 
int shared_data = -1;
 
#pragma data_seg()
#pragma comment(linker, "/section:SharedMemory,RWS") 

如上所示,在dll中定义了一个名叫”SharedMemory”的共享数据段,它在所有进程中都是唯一的

当第一个进程调用它时,里面的变量会被初始化,从此之后,无论有多少进程调用,shared_data变量对应的都是同一块内存,这就意味着多个进程可以对同一个变量进行读写

当最后一个进程退出时,这块共享内存才会被回收,并在下一次调用时重新初始化

因此我们可以通过多个进程调用同一个dll来实现进程通讯

代码语言:javascript
复制
#pragma data_seg("SharedMemory")
 
int shared_data = -1;
 
#pragma data_seg()
#pragma comment(linker, "/section:SharedMemory,RWS")
 
extern "C" _declspec(dllexport) int Read() {
    return shared_data;
}
 
extern "C" _declspec(dllexport) void Write(int data) {
    shared_data = data;
}

C#调用

注意将下面的dll地址换成你自己的dll地址

代码语言:javascript
复制
[DllImport(@"C:\Users\Administrator\桌面\SharedMemory.dll", EntryPoint = "Read")]
public static extern int Read();
        
[DllImport(@"C:\Users\Administrator\桌面\SharedMemory.dll", EntryPoint = "Write")]
public static extern void Write(int data);

python调用

下面的代码将会在控制台打印shared_data的变量值

代码语言:javascript
复制
from ctypes import *
dll = CDLL(r"C:\Users\Administrator\桌面\SharedMemory.dll")
result = dll.Read()
print(str(result))

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 共享数据段
  • C#调用
  • python调用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档