抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

共享数据段

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

1
2
3
4
5
6
#pragma data_seg("SharedMemory")

int shared_data = -1;

#pragma data_seg()
#pragma comment(linker, "/section:SharedMemory,RWS")

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#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地址

1
2
3
4
5
[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的变量值

1
2
3
4
from ctypes import *
dll = CDLL(r"C:\Users\Administrator\桌面\SharedMemory.dll")
result = dll.Read()
print(str(result))

评论