lesson 17 进程间通信 孙鑫 VC++

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变量,需要创建人工重置事件对象句柄

_2ConnectNamedPipe

_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: 先接收, 后发送