剪贴板,匿名管道,命名管道,邮槽学习笔记

来源:互联网 发布:软件培训 编辑:程序博客网 时间:2024/04/29 12:54
 

源代码在后面

 

进程间进行通信的四种方式:
剪贴板,匿名管道,命名管道,邮槽

1).ClipBoar
OpenClipboard()               //打开剪贴板
CloseClipboard()             //打开剪贴板,必须将其关闭,否则其他应用程序将无法打开
                                            //剪贴板
EmpyClipboard()            //调用这个函数,将使得CWnd获得剪贴板的所有权
SetClipboardData()        //以一定格式在剪贴板存放数据,其中第二个参数设置为NULL
                                           //将会延迟提交数据,以提高对资源的利用
GlobalLock()                   //将一个全局内存对象句柄转换成指针,并对其加锁
GlobalUnlock()               //加锁后的内存对象将无法移动和移除,需要调用该函数解锁
GlobalAlloc()                  //分配指定字节数的内存空间

GetClipboardData()   //获取剪贴板上的数据
IsClipboardFormatAvailable()  //检测是否想要的数据

将数据放到剪贴板上的步骤:
1.获得数据
2.分配内存空间
3.获得内存空间的指针
4.通过指针将数据复制到内存空间
5.打开剪贴板
6.将内存空间放到剪贴板上
7.关闭剪贴板

 


2).Pipe
CreatePipe()                //创建一个匿名管道,其中第三个参数不能为NULL,因为父
                                      //进程和子进程之间通信需要用到从父进程继承而来的句柄
CreateProcess()    //创建并启动一个新的进程
     --AmL.tu_s    2011.07.29

 
对于STARTUPINFO sa结构体,当sa.nFlags = STARTF_USRSTDHANDLES 时,只有sa.hStdIput~sa.hStdError有用


GetStdHandle()    //可以获取父进程的标准输入、输出和错误句柄
ZeroMemory()    //将一段内存设为0

匿名管道的使用:
1.由父进程先创建一个匿名管道,供之后与子进程进行通信
2.由父进程启动子进程,并将匿名管道的句柄传给子进程的标准输入、输出句柄(相当于告诉子进程匿名管道的位置)
3.子进程通过GetStdHandle()获得由父进程传递的匿名管道句柄,并通过这个句柄与父进程通信,而父进程也通过这个匿名管道句柄与子进程通信。

     --AmL.tu_s    2011.07.30 

3).NamePipe
CreateNamedPipe()   //创建命名管道
ConnectNamePipe()   //调用这个函数等待客户端连接
服务端
1.创建命名管道
2.创建事件对象
3.定义一个OVERLAPPED结构体,用刚创建的事件对象作为值赋给第三个成员
4.等待客户端连接
5.等待事件对象

WaitNamedPipe()    //等待可利用的命名管道
CreateFile()    //打开命名管道,其返回值为一个句柄
客户端
1.等待一个可利用的管道
2.打开管道,进行通信


4).Mailslot(代码简单,但是所能发送的数据量较少)
CreateMailslot()   //以指定名字创建邮槽,返回值为邮槽句柄

邮槽服务端只接收数据,客户端只发送数据
服务端
1.创建邮槽
2.读取数据

客户端
1.打开邮槽
2.发送数据

 

 

源代码下载

http://download.csdn.net/source/3485016    剪贴板

http://download.csdn.net/source/3485038    邮槽

http://download.csdn.net/source/3485045    匿名管道

 

原创粉丝点击