跨进程共享数据,常用的方法是共享内存,消息交换等方式
近日研究了一个以采用 DLL 共享节区方式达到目的的方法
以 M$ Link.exe 6.0 为基础测试了 Masm32,VB6 均达到预想效果,公布方法方便大家使用
1. VB 编译的 PE 文件中的节区
节区是 PE 文件储存数据的地方,段是编程时数据及代码等存储的空间,VB编程 根本就接触不到这些
VB 编译的 PE 文件通常包括这几个 .data .text .rsrc .reloc
其中 .data 保存着有初值的公共变量; .text 保存着代码; .rsrc 是PE文件资源节
.reloc 一般在 DLL 中存在,是重定位信息
节包含代码或数据。与段不同,节是连续内存的块,没有大小限制。
有些节包含程序声明和直接使用的代码或数据,而有些数据节是由链接器和库管理器 (lib.exe) 创建的,
包含了对操作系统来说至关重要的信息。
2. 节区的属性
节区都是有属性的,包括 7 个属性:
| 字符 |
属性 |
含意 |
|
E | Execute | 节是可执行的 |
| R | Read | 允许对数据进行读取操作 |
| W | Write | 允许对数据进行写操作 |
| S | Shared | 在所有加载图像的进程中共享节 |
| D | Discardable | 将节标记为可放弃 |
| K | Cacheable | 将节标记为不可缓存 |
| P | Pageable | 将节标记为不可分页 |
Shared( S ) 属性是我们需要的,在编译时添加这个编译参数就可以达到将指定节共享的目的
3. 操作方法
M$ 的 Link.exe 6.0↑ 有这样一个编译参数,可以达到修改节区属性的功能:
End Function
用上面介绍的连接方法编译为一个 DLL, 注意将工程改个名,别用默认的 工程1
否则,可能因为你系统中注册过这个名,导致这个 DLL 不能用, 比如改成 TestSharedField
5. 应用
最主要,也是这个功能的最根本的出发点就是跨进程的通信了.
1. 只能运行程序的一个副本的功能,如果使用这个方法实现, 那简直无敌了....(别真以为无敌)
不过相对的比其他方法真是方便,简单,安全多了,但这适合大工程,那些挂了几个 DLL 的工程
2. 全局钩子也可以用这个功能实现跨进程通信, 比起共享内存简单多了吧.有的钩子因为必须挂 DLL
那正好设置一个共享节,来通信.
3. 其他.... 有待开发
4. (未完不续) ...