共享数据段
在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))
|