进程间通信主要包括三种:消息,剪贴板,内存映射。
消息:这种方法的实现主要用了WM_COPYDATA,从内存的2G开辟了公共空间,我们发消息时用到了 :SendMessage ,而为什么不用PostMessage呢,这是因为如果用了PostMessage的话,你要是不去取它,它就会一直都占用着内存,会造成内核浪费。
剪贴板:
主要包括了复制和粘贴两个部分.下面是两部分的基本步骤:
复制:
1.打开剪贴板 OpenClipboard
2.清空剪贴板 EmptyClipboard
3.申请全局堆空间GlobalAlloc
4.加锁GloLock
5复制内容操作
6.解锁GlobalUnlock
7.设置剪贴板的数据格式SetClipboardData
8.关闭剪贴板 Closeclipboard
粘贴:
1.打开剪贴板 OpenClipboard
2.检验剪贴板数据格式:IsclipboardFormatAvailable;
3.得到剪贴板数据GetClipboardData
4.加锁GloLock
5.取内容
6.解锁GlobalUnlock
7.关闭剪贴板 Closeclipboard
内存映射:
因为是在物理内存申请,跳过了系统这一环节,所以速度很快,我做了一个实验循环创建,删除10W数据,内存映射方法大概用了5秒左右,
而new delete 用时接近一分钟,效率提高了10倍左右。
以下是我实现的一个应用 内存映射 发送字符串的小例子:
发送端:
HANDLE hFileMaping = NULL;
CString strValue;
int nSize;
m_edt.GetWindowText(strValue);
if (!strValue.IsEmpty())
{
nSize = strValue.GetLength()+1;
hFileMaping = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,nSize,"MyFIleMapping");
char *pStartAddr = (char *)MapViewOfFile(hFileMaping,FILE_MAP_WRITE|FILE_MAP_READ,0,0,nSize);
strcpy(pStartAddr,strValue.GetBuffer());
UnmapViewOfFile(pStartAddr);
}
}
接收端:
HANDLE hRecvMaping;
hRecvMaping = OpenFileMapping(FILE_MAP_READ,FALSE,"MyFIleMapping");
if (hRecvMaping)
{
char *str = (char *)MapViewOfFile(hRecvMaping,FILE_MAP_READ,0,0,0);
m_strContent.Format("%s",str);
UnmapViewOfFile(str);
Invalidate(TRUE);
}
CloseHandle(hRecvMaping);
以上就是我近期的理解,希望大家多多交流.