Windows进程间通信邮槽使用邮槽的进程分为服务端和客户端。客户端只能发送消息服务端只能读取消息消息的结构和队列类似。服务端代码示例#includewindows.h#includeiostreamintmain(){// 创建邮槽HANDLE hMailslotCreateMailslot(L\\\\.\\mailslot\\MyMailslot,// 邮槽名称0,// 无最大消息大小限制MAILSLOT_WAIT_FOREVER,// 无限等待NULL// 默认安全属性);if(hMailslotINVALID_HANDLE_VALUE){std::cerr创建邮槽失败错误码GetLastError()std::endl;return1;}std::cout邮槽创建成功等待消息...std::endl;charbuffer[256];DWORD bytesRead;// 读取客户端发送的消息if(ReadFile(hMailslot,buffer,sizeof(buffer),bytesRead,NULL)){buffer[bytesRead]\0;std::cout收到消息bufferstd::endl;}CloseHandle(hMailslot);return0;}客户端代码示例#includewindows.h#includeiostreamintmain(){// 打开服务端的邮槽HANDLE hMailslotCreateFile(L\\\\.\\mailslot\\MyMailslot,GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);if(hMailslotINVALID_HANDLE_VALUE){std::cerr打开邮槽失败错误码GetLastError()std::endl;return1;}constchar*messageHello from client!;DWORD bytesWritten;// 发送消息if(WriteFile(hMailslot,message,strlen(message)1,bytesWritten,NULL)){std::cout消息发送成功std::endl;}CloseHandle(hMailslot);return0;}管道管道的本质是共享内存。匿名管道匿名管道只能在父子进程间进行通信不能在网络间通信而且数据传输是单向的只能一端写另一端读。#includewindows.h#includeiostream#includestringintmain(){HANDLE hRead,hWrite;SECURITY_ATTRIBUTES sa{sizeof(SECURITY_ATTRIBUTES),NULL,TRUE};// 创建匿名管道if(!CreatePipe(hRead,hWrite,sa,0)){std::cerr创建管道失败std::endl;return1;}// 父进程写入数据constchar*dataHello from parent process!;DWORD bytesWritten;WriteFile(hWrite,data,strlen(data)1,bytesWritten,NULL);// 父进程读取数据同一进程内演示charbuffer[256];DWORD bytesRead;ReadFile(hRead,buffer,sizeof(buffer),bytesRead,NULL);buffer[bytesRead]\0;std::cout读取到数据bufferstd::endl;CloseHandle(hRead);CloseHandle(hWrite);return0;}命名管道命名管道可以在任意进程间通信通信是双向的任意一端都可读可写但是在同一时间只能有一端读、一端写。服务端代码#includewindows.h#includeiostreamintmain(){// 创建命名管道HANDLE hPipeCreateNamedPipe(L\\\\.\\pipe\\MyPipe,// 管道名称PIPE_ACCESS_DUPLEX,// 双向通信PIPE_TYPE_MESSAGE|PIPE_READMODE_MESSAGE|PIPE_WAIT,PIPE_UNLIMITED_INSTANCES,// 最大实例数512,512,// 输入输出缓冲区大小0,NULL// 超时和安全性);if(hPipeINVALID_HANDLE_VALUE){std::cerr创建命名管道失败std::endl;return1;}std::cout等待客户端连接...std::endl;// 等待客户端连接if(ConnectNamedPipe(hPipe,NULL)){charbuffer[256];DWORD bytesRead;// 读取客户端消息ReadFile(hPipe,buffer,sizeof(buffer),bytesRead,NULL);buffer[bytesRead]\0;std::cout收到客户端消息bufferstd::endl;// 回复客户端constchar*replyHello from server!;DWORD bytesWritten;WriteFile(hPipe,reply,strlen(reply)1,bytesWritten,NULL);}DisconnectNamedPipe(hPipe);CloseHandle(hPipe);return0;}客户端代码#includewindows.h#includeiostreamintmain(){// 连接到服务端的命名管道HANDLE hPipeCreateFile(L\\\\.\\pipe\\MyPipe,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);if(hPipeINVALID_HANDLE_VALUE){std::cerr连接命名管道失败std::endl;return1;}// 发送消息constchar*messageHello from client!;DWORD bytesWritten;WriteFile(hPipe,message,strlen(message)1,bytesWritten,NULL);// 接收回复charbuffer[256];DWORD bytesRead;ReadFile(hPipe,buffer,sizeof(buffer),bytesRead,NULL);buffer[bytesRead]\0;std::cout收到服务端回复bufferstd::endl;CloseHandle(hPipe);return0;}剪贴板剪贴板是Windows提供的一种简单的进程间通信机制所有进程都可以访问系统剪贴板实现数据的共享和传递。#includewindows.h#includeiostream#includecstring// 写入文本到剪贴板boolWriteToClipboard(constchar*text){if(!OpenClipboard(NULL)){returnfalse;}// 清空剪贴板EmptyClipboard();// 分配全局内存size_t sizestrlen(text)1;HGLOBAL hGlobalGlobalAlloc(GMEM_MOVEABLE,size);if(hGlobalNULL){CloseClipboard();returnfalse;}// 复制数据到全局内存memcpy(GlobalLock(hGlobal),text,size);GlobalUnlock(hGlobal);// 设置剪贴板数据SetClipboardData(CF_TEXT,hGlobal);CloseClipboard();returntrue;}// 从剪贴板读取文本std::stringReadFromClipboard(){if(!OpenClipboard(NULL)){return;}HANDLE hDataGetClipboardData(CF_TEXT);if(hDataNULL){CloseClipboard();return;}char*textstatic_castchar*(GlobalLock(hData));std::stringresult(text);GlobalUnlock(hData);CloseClipboard();returnresult;}intmain(){// 写入剪贴板constchar*dataHello from Process A!;if(WriteToClipboard(data)){std::cout数据已写入剪贴板std::endl;}// 读取剪贴板std::string readDataReadFromClipboard();std::cout从剪贴板读取readDatastd::endl;return0;}内存映射文件内存映射文件允许不同进程将同一个文件映射到各自的虚拟地址空间从而实现高效的共享内存通信。#includewindows.h#includeiostream#includecstringintmain(){// 创建或打开文件映射对象HANDLE hMapFileCreateFileMapping(INVALID_HANDLE_VALUE,// 使用系统分页文件NULL,// 默认安全属性PAGE_READWRITE,// 读写权限0,// 高32位大小256,// 低32位大小256字节LLocal\\MySharedMemory// 映射对象名称);if(hMapFileNULL){std::cerr创建文件映射失败std::endl;return1;}// 将文件映射到进程地址空间LPVOID pBufferMapViewOfFile(hMapFile,FILE_MAP_ALL_ACCESS,// 完全访问权限0,0,// 偏移量0// 映射整个文件);if(pBufferNULL){std::cerr映射视图失败std::endl;CloseHandle(hMapFile);return1;}// 写入共享内存constchar*messageHello from Process A!;memcpy(pBuffer,message,strlen(message)1);std::cout数据已写入共享内存std::endl;// 读取共享内存另一个进程也可以读取std::cout从共享内存读取(char*)pBufferstd::endl;// 清理资源UnmapViewOfFile(pBuffer);CloseHandle(hMapFile);return0;}SocketSocket套接字是Windows中最强大的进程间通信方式之一不仅支持本地进程通信还支持网络间的远程通信。#includewinsock2.h#includeiostream#includecstring#pragmacomment(lib,ws2_32.lib)intmain(){// 初始化WinsockWSADATA wsaData;if(WSAStartup(MAKEWORD(2,2),wsaData)!0){std::cerrWinsock初始化失败std::endl;return1;}// 创建套接字SOCKET serverSocketsocket(AF_INET,SOCK_STREAM,0);if(serverSocketINVALID_SOCKET){std::cerr创建套接字失败std::endl;WSACleanup();return1;}// 绑定地址和端口sockaddr_in serverAddr;serverAddr.sin_familyAF_INET;serverAddr.sin_addr.s_addrINADDR_ANY;serverAddr.sin_porthtons(8888);if(bind(serverSocket,(sockaddr*)serverAddr,sizeof(serverAddr))SOCKET_ERROR){std::cerr绑定失败std::endl;closesocket(serverSocket);WSACleanup();return1;}// 监听连接listen(serverSocket,5);std::cout服务器启动等待连接...std::endl;// 接受客户端连接sockaddr_in clientAddr;intclientLensizeof(clientAddr);SOCKET clientSocketaccept(serverSocket,(sockaddr*)clientAddr,clientLen);if(clientSocket!INVALID_SOCKET){charbuffer[256];recv(clientSocket,buffer,sizeof(buffer),0);std::cout收到客户端消息bufferstd::endl;constchar*replyHello from server!;send(clientSocket,reply,strlen(reply),0);closesocket(clientSocket);}closesocket(serverSocket);WSACleanup();return0;}