前言:
写这个源码是自己写的一个易程序,需要调用Python处理一些东西,易语言做界面程序,看到初级办法就是写入文件,双方读取文件进行通信,由于涉及I/O操作,感觉效率比较低,就改进了一下,通过调用windows API函数进行实现。【这里就都用易语言实现了】
通过调用Win32 API中共享内存方法实现,实际就是文件映射的一种特殊情况。就是利用进程在创建文件映射对象时用0xFFFFFFFF来代替文件对象句柄(HANDLE),其它进程打开该文件映射对象就可以访问该内存区域。只能运行于同一计算机上的进程之间。
实现思路:
创建方(服务端)- 创建共享文件对象CreateFileMapping(映射文件对象句柄,安全保护,访问权限,对象大小,共享内存大小,映射文件名称)(注意:映射文件名双方必须一致)
- 共享文件对象映射到本进程内存地址MapViewOfFile(共享内存地址,访问权限,文件映射起始偏移的高位,文件映射起始偏移的低位, 映射文件的字节数)(一般情况:填写共享内存地址和访问权限即可,其他参数默认置0)
- 创建事件CreateEventW(事件对象继承,手动重置,初始状态,事件对象名称)用于不同进程间的同步【信号灯事件】
连接方(客户Duan)- [color=rgba(0, 0, 0, 0.75)]打开共享文件对象 OpenFileMappingA(访问权限,对象句柄继承,映射文件名)
- 共享文件对象映射到本进程内存地址MapViewOfFile(共享内存地址,访问权限,文件映射起始偏移的高位,文件映射起始偏移的低位, 映射文件的字节数)
- 创建事件同样数量的事件CreateEventW(事件名称要与服务端一致)。在创建事件时系统就会发现这个事件已经被另一方创建过,就直接将创建好的句柄返回来。实现进程同步读取
进程同步:例如 现有俩个事件分别是get_read和get_wri;
初始状态get_read和get_wri事件的信号灯都是灭的。先启动创建方,然后启动连接方时,在初始化时将创建方的get_wri事件的信号灯点亮,这样创建方获得信号灯就可以直接写入共享内存中并将get_read灯点亮将get_wri灯弄灭。然后连接方获得get_read灯亮就可以读取共享内存中的数据,读取完毕后再将get_read灯弄灭将get_wri灯点亮。这样就实现了进程间的通讯。 最后,上面资料来自MSDN查阅函数和CSDN博客资料),非常感谢提供例子,代码自行理解写的,如有不足,欢迎大佬指点改进。

软件截图:
关键代码:
1.服务端
2.客户Duan
不想写dll了,直接调用了精易模块,自备模块吧
test_服务端.e
(1.72 MB, 下载次数: 51)
|