基层建设网站,海南网站建设制作,邢台同城,微信营销网络营销方式win32进程间通信 文件映射共享内存匿名管道命名管道远程过程调用#xff08;RPC#xff09;对象连接与嵌入#xff08;OLE#xff09;动态数据交换#xff08;DDE#xff09;剪贴板WM_COPYDATA消息邮件槽其它 文件映射
特点#xff1a;本地间通信#xff0c;不能用于网… win32进程间通信 文件映射共享内存匿名管道命名管道远程过程调用RPC对象连接与嵌入OLE动态数据交换DDE剪贴板WM_COPYDATA消息邮件槽其它 文件映射
特点本地间通信不能用于网络需控制进程同步 三种方法来使多个进程共享一个文件映射对象
继承。父进程创建文件映射对象子进程继承其句柄命名文件映射。给文件映射对象一个名字其它进程通过名字其它IPC传递打开映射对象句柄复制。通过其它IPC通信方式传递对象句柄到另一个进程
共享内存
特点文件映射的一种特殊方式 进程在创建文件映射对象时用0xFFFFFFFF来代替文件句柄(HANDLE)就表示了对应的文件映 射对象是从操作系统页面文件访问内存其它进程打开该文件映射对象就可以访问该内存块。
匿名管道
特点父子进程通信或者子进程间通信不能在两个不相关进程通信子进程标准I/O重定向 两个带句柄的进程作为2个端点建立一条通信通道一般一段负责读另一端负责写也可以做成两端可读写
命名管道
特点可进行远程通信服务器但在1对多的情况下较困难 服务器端本地进程创建命名管道远端打开这个管道根据给定的权限跟其它服务器通信
远程过程调用RPC
特点实现远程接口本地调用跨操作系统远程通信 Win32 API提供的远程过程调用(RPC)使应用程序可以使用远程调用函数通过Win32 API编写的RPC应用程序能与其它操作系统上支持DEC的RPC应用程序通信
对象连接与嵌入OLE
特点可嵌套电子表格打开自启动表格编辑器关闭自动更新表格文档 应用程序利用对象连接与嵌入(OLE)技术管理复合文档(由多种数据格式组成的文档)OLE提供使某应用程序更容易调用其它应用程序进行数据编辑的服务。
动态数据交换DDE
特点自定义数据格式远端操作 动态数据交换(DDE)是使用共享内存在应用程序之间进行数据交换的一种进程间通信形式。 DDE有 三种数据交换方式 (1) 冷链数据交换是一次性数据传输与剪贴板相同。 (2) 温链当数据交换时服务器通知客户然后客户必须请求新的数据。 (3) 热链当数据交换时服务器自动给客户发送数据。
剪贴板
特点操作简单有丰富的API函数windows应用程序间通信 剪贴板为Windows应用程序之间进行数据共享提供了一个中介是一个非常松散的交换媒介支持任何数据格式只需在数据格式上一致或都可以转化为某种格式就行
// 常用数据格式
#define CF_TEXT 1
#define CF_BITMAP 2
#define CF_METAFILEPICT 3
#define CF_SYLK 4
#define CF_DIF 5
#define CF_TIFF 6
#define CF_OEMTEXT 7
#define CF_DIB 8
#define CF_PALETTE 9
#define CF_PENDATA 10
#define CF_RIFF 11
#define CF_WAVE 12
#define CF_UNICODETEXT 13// 复制内容到剪贴板
if (OpenClipboard(m_hWnd))
{CStringW strWide CStringW(L这是测试内容);int nLen strWide.GetLength();::EmptyClipboard();HANDLE clipbuffer ::GlobalAlloc(GMEM_DDESHARE, (nLen 1) * 2);if (!clipbuffer){::CloseClipboard();return;}char* buffer (char*)::GlobalLock(clipbuffer);memset(buffer, 0, (nLen 1) * 2);memcpy_s(buffer, nLen * 2, strWide.GetBuffer(0), nLen * 2);strWide.ReleaseBuffer();::GlobalUnlock(clipbuffer);::SetClipboardData(CF_UNICODETEXT, clipbuffer);::CloseClipboard();
}// 粘贴剪贴板内容
OpenClipboard(m_hWnd);
if (IsClipboardFormatAvailable(CF_UNICODETEXT))
{//取出数据 HGLOBAL hg GetClipboardData(CF_UNICODETEXT);//锁定内存块 LPWSTR wstr (LPWSTR)GlobalLock(hg);if (wstr ! NULL){MyMessageBox(wstr);}GlobalUnlock(hg);
}
CloseClipboard();注意复制和粘贴的内容格式保持一致。
WM_COPYDATA消息
特点操作简单通信安全底层通过文件映射实现 通过调用SendMessage函数接收方像处理普通消息一样在数据拷贝完成前不返回这样发送方就不可能删除和修改数据可实现安全传输
// 数据结构
typedef struct tagCOPYDATASTRUCT{ DWORD dwData;//用户定义数据 DWORD cbData;//数据大小 PVOID lpData;//指向数据的指针
}COPYDATASTRUCT;// 发送方
char copystr[] hello world! ;
CopyData.dwData 1;//这个是自定义数据随意填
CopyData.cbData strlen(copystr);//发送数据的大小
CopyData.lpData (char*)copystr;//指向数据的指针
::SendMessage(g_pHwnd, WM_COPYDATA, 0, (LPARAM)CopyData);// 接收方
COPYDATASTRUCT *pCopyData (COPYDATASTRUCT*)lParam;
char *pData new char[pCopyData-cbData1];
memcpy(pData, pCopyData-lpData , pCopyData-cbData);
pData[pCopyData-cbData] \0;邮件槽
特点双向通信数据传输不可靠UDP包有简化的编程接口可进行进程消息广播 进程服务器创建邮件槽其它进程作为邮件槽客户客户通过邮件槽名字给进程服务器发消息 实现单向通信。任何进程都可创建邮件槽故可进行双向通信。
其它
除了这些进程间通信方式还有很多。如
socket套接字经常使用的动态链接库DLL全局数据实现共享NetBios函数处理低级网络控制不常用