前往我的主页以获得更好的阅读体验通过dll的跨进程通讯 - DearXuan的主页https://blog.dearxuan.com/2022/03/22/%E9%80%9A%E8%BF%87dll%E7%9A%84%E8%B7%A8%E8%BF%9B%E7%A8%8B%E9%80%9A%E8%AE%AF/
共享数据段
在dll中使用 #pragma data_seg() 可以创建一个共享数据段
#pragma data_seg("SharedMemory")
int shared_data = -1;
#pragma data_seg()
#pragma comment(linker, "/section:SharedMemory,RWS")
如上所示,在dll中定义了一个名叫"SharedMemory"的共享数据段,它在所有进程中都是唯一的
当第一个进程调用它时,里面的变量会被初始化,从此之后,无论有多少进程调用,shared_data变量对应的都是同一块内存,这就意味着多个进程可以对同一个变量进行读写
当最后一个进程退出时,这块共享内存才会被回收,并在下一次调用时重新初始化
因此我们可以通过多个进程调用同一个dll来实现进程通讯
#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地址
[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的变量值
from ctypes import *
dll = CDLL(r"C:\Users\Administrator\桌面\SharedMemory.dll")
result = dll.Read()
print(str(result))