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

  • 相关阅读:
    Mybaits的10种通用的写法
    你清楚这几个Spring常用注解吗?
    面试时如何介绍自己
    Spring加载加密的配置文件
    MySQL主从复制
    CentOS7安装和配置MySQL
    Druid监控页面配置与使用
    Shiro配置URL过滤
    基于注解的Dubbo服务配置
    Java中常用的加密算法小结
  • 原文地址:https://www.cnblogs.com/aprilapril/p/3178616.html
Copyright © 2020-2023  润新知