Lesson 17 进程间通信
17.1 剪贴板
1,建立发送和接收对话框,用于拷贝和粘贴
2,拷贝到剪贴板
-1,打开剪贴板
OpenClipboard();
-2,清空剪贴板
EmptyClipboard();
-3,从堆上分配指定的字帖
HGLOBAL GlobalAlloc(UINT uFlags, SIZE_T dwBytes);
-4, 对全局内存加锁,然后返回该对象内存第一个字节的指针
LPVOID GlobalLock( HGLOBAL hMem);
-5, 将数据拷贝到全部内存中
Strcpy(pBuf,str);
-6 对该内存解锁
LPVOID GlobalLock(HGLOBAL hMem);
-7, 向剪贴板中放置数据
HANDLE SetClipboardData(UINT uFormat, HANDLE hMem);
-8,关闭剪贴板
CloseCipboard();
3,从剪贴板粘贴数据
-1,打开剪贴板
-2,查看是否有我们想要的特定格式的数据
BOOL IsClipboardFormatAvailable(UINT format);
-3, 返回一个以指定格式存在的剪贴板对象的句柄
HANDLE GetClipboardData(UINT uFormat);
-4, 为了使用指针类型的内存地址,调用内存加锁函数
-5,对内存对象进行解锁
-6, 将数据放到接收编辑框
17.2 匿名管道
_____基础知识
1,匿名管道是一个未命名的、单向管道,实现两个进程之间的通信
匿名管道只能在父子进程间通信。子进程如果想要获得匿名管道的句柄,只能从父进程继承而来,然后这两个进程就可以通过该句柄进行通信
2,创建匿名管道 Createpipe
_____进程的创建
Creatprocess
3,父进程的实现
_1,增加一个子菜单,匿名管道,含三个子菜单,创建管道,读取数据,写入数据
_2,为view类增加两个句柄,用于读写,
并初始化 为 NULL
析构函数中,如果这两个变量有值,则关闭
Closehandle(hRead);
_3, 创建匿名管道
__1,创建匿名管道,失败则退出
之前需要定义安全结构体类型变量,并赋值。
__2,启动子进程,将匿名管道的读写句柄传递给子进程。
之前需要定义参数:STARTUPINFO结构体类型的值,先清零再设值。
获得句柄 HANDLE GetStdHandle(DWORD nStdHandle)
需要定义返回值参数:PROCESS_INFORMATION结构体变量,
__3,如果进程启动失败,则关闭句柄,并可句柄变量清零,返回
__4,如果进程成功,则关闭子进程和子线程的句柄
4,读取数据
ReadFile( hRead, buf, 100, &dwRead, NULL);
如果失败则返回。
显示读到的数据 MessageBox(buf);
5,写入数据
WriteFile(hWrite, buf, strlen(buf)+1, &dwWrite, NULL)
如果写入失败则返回
4,子进程的实现
_1,新建工程,名 Child , 添加到Parent程序所在的工作区中。
_2,添加子菜单,匿名管道,添加菜单项,读取数据,写入数据。
_3, 添加私有成员变量:两个句柄,初始化,以及析构函数中如果有值则关闭
_4,获得管道的读取和写入句柄
添加虚函数 OnInitialUpdate //窗口创建成功后,第一个调用的函数
调用 GetStdHandle
_5,读取数据
ReadFile , 利用上面得到的句柄
_6,写入数据
17.3 命名管道
17.3.1 基础知识
1,可以跨网络实现两个进程间的通信
它建立了一个客户机/服务端通信体系,并在其中可靠地传输数据。利用标准的win32文件系统函数来进行数据的手法
2,两种基本通信模式:字节模式 和 消息模式
3,创建一个命名管道 CreateNamedPipe
17.3.2 服务器端程序
1,添加菜单: 命名管道,添加子菜单: 创建管道,读取数据,写入数据
2,添加句柄,保存创建的命名管道实例的句柄,初始化,析构中关闭句柄处理
3,创建句柄 CreateNamedPipe, 失败则返回
4,等待客户端请求道理
_1, 之前需要定义 OVERLAPPED 变量
__1, 为了定义OVERLAPPED变量,需要创建人工重置事件对象句柄
_2,ConnectNamedPipe
_3,判断如果错误是 ERROR_IO_PENDING != GetLastError(), 关闭句柄和事件,再返回
_4, 如果 WAIT_FAILED == WaitForSingleObject(hEvent, INFINITE)
关闭事件和句柄,返回
_5, 变比事件。
5,读取数据
6,写入数据
17.3.3 客户端程序
1,同上1, 2,
3,连接命名管道
WaitNamedPipe
如果没有可用的命名管道,则退出
4, 打开可用的命名管道,与服务器端程序进行通信
NOTE: 创建命名管道后,服务器端貌似死机状态,等待客户端连接
17.4 邮槽
——基于广播通信体系设计出来的,采用无连接的不可靠的数据传输。
——单向通信机制,创建邮槽的服务器进程读取数据,打开邮槽的客户机进程写入程序,消息的长度限制在424字节以下。
——创建邮槽
CreateMailslot
17.4.1 服务器端程序
1,新建单文档类MFC应用程序:MailslotSrv。添加子菜单,接收数据。
2,接收命令函数
_1,创建邮槽,失败则返回
_2,从邮槽读取数据,失败则返回
_3,输出读到数据,关闭邮槽句柄
17.4.2 客户端程序
1,添加工程 MailslotClt, 添加子菜单,发送数据
2,发送命令函数
_1,打开邮槽
_2,写入数据
_3, 关闭句柄
Note: 先接收, 后发送