源代码在后面
进程间进行通信的四种方式:
剪贴板,匿名管道,命名管道,邮槽
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 剪贴板