windows 5 进程间通信
进程间通信
发送消息
一般是自定义消息,使用SendMessage发送

新建项目


1 |
|

添加自定义消息,确定后点击编辑代码

1 | afx_msg LRESULT CB1Dlg::OnMsTest(WPARAM wParam, LPARAM lParam) |
在头文件处要添加定义

在B1初始化处要给窗口添加名字

1 | BOOL CB1Dlg::OnInitDialog() |
在外面的文件夹中打开A1.exe和B1.exe,然后点击发送消息,A1就会向B1发送消息

WM_COPYDATA
可以携带少量数据,效率低
先将数据拷贝高2G内存中,然后再从高2G拷贝到目标进程中,发生两次拷贝,所以效率低


A1Dlg.cpp
1 | void CA1Dlg::OnBnClickedButton2() |
在类视图中选中CB1Dlg,在类向导中找到WM_COPYDATA并双击,添加到现有处理程序中,然后双击函数名开始编辑

B1Dlg.cpp
1 | BOOL CB1Dlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) |
重新生成解决方案后运行A1.exe和B1.exe,点击WM_COPYDATA,A1就会向B1发送消息

dll共享段
步骤:
定义共享段,并定义导出变量,注意导出变量需要初始化
1
2
3
__declspec(dllexport) DWORD g_dwVal = 0;将此共享段声明为可共享
1 |

找到SECTION并点入


R可读,W可写,S可共享
然后添加新建项目




点击两个按钮开始编辑
1 |
|
运行后按读会读取一个0

在写的地方填写数据后点击写,再点击读即可读取刚刚写入的数据

还可以写入或读取字符串
dllmain.cpp
1 |
|
UseDlg.cpp
1 |
|
运行后写入字符串即可读取

文件映射
文件操作相关API
1 | /* |

1 | // FileTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 |
下断点进行调试,观察是否成功运行,最后有输出即说明成功运行

文件映射用于读写文件数据
步骤
- 打开文件CreateFile
- 创建文件映射对象CreateFileMapping
- 将文件映射到内存MapViewOfFile
- 使用
- 将文件从内存撤销映射UnmapViewOfFile
- 关闭文件映射对象CloseHandle
- 关闭文件CloseHandle
将main函数中的内容全部选中提取函数




1 | // FileTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 |
下断点进行调试检查是否正常运行
文件映射用于进程间通信(带文件)
使用步骤
- 打开文件映射对象CreateFileMapping/OpenFileMapping
- 将文件映射到内存MapViewOfFile
- 使用
- 将文件从内存撤销映射UnmapViewOfFile
- 关闭文件映射对象CloseHandle
- 关闭文件CloseHandle
新建控制台应用


FileTest.cpp
1 | int main() |
ShareFileMap.cpp
1 | // ShareFileMap.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 |
运行后下断点调试是否成功运行,若成功运行则两个进程之间可以数据共享
修改FileTest

刷新后ShareFileMap的内存值也被修改

运行结束可以正常输出

文件映射用于进程间通信(无文件)
创建步骤:
- 创建文件映射对象CreateFileMapping
- 将文件映射到内存MapViewOfFile
- 使用
- 将文件从内存撤销映射UnmapViewOfFile
- 关闭文件映射对象CloseHandle
- 关闭文件CloseHandle
使用步骤:
- 打开文件映射对象CreateFileMapping/OpenFileMapping
- 将文件映射到内存MapViewOfFile
- 使用
- 将文件从内存撤销映射UnmapViewOfFile
- 关闭文件映射对象CloseHandle
- 关闭文件CloseHandle

FileTest.cpp
1 | // FileTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 |
运行后下断点调试是否成功运行,若成功运行则两个进程之间可以数据共享
修改FileTest

刷新后ShareFileMap的内存值也被修改

运行结束可以正常输出

管道
这集没讲完,详情请看下一集
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Hexo!