先说一种比较类似的方法。通过发送WM_COPYDATA来传送数据。
如果用SendMessage发送,发送方要等待接收方返回,期间发送方将被阻塞。
如果用PostMessage发送,在数据发送过于频繁时,有可能发生数据丢失。
所以在发送大数据量时,从性能方面考虑WM_COPYDATA并不是很好的一种方法。
共享内存是通过直接操作内存映射文件来进行的,而内存映射文件又是进行单机数据共享的最低层机制,前面几种数据交换方式在低层都是通过内存映射文件来进行的。因此使用共享内存可以以较小的开销获取较高的性能,是进行大数据量数据快速交换的最佳方案。
下面介绍几个函数:
HANDLE hFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE | SEC_COMMIT, 0, 1000000, "DataMap");
其中最后一个是共享内存的名字。其它进程就通过这个名字取得共享内存。
这个返回的句柄使用完了可以用CloseHandle(hFile)关闭。
LPBYTE lpData = (LPBYTE)MapViewOfFile(hFile, FILE_MAP_WRITE, 0, 0, 0);
将CreateFileMapping创建的共享内存映射到本进程的虚拟地址空间。参数2表示写操作。返回映射后的内存首地址,可以向这个地址中写入数据
如用以下方法写入
TCHAR buf[1024] = "filemap bbb";
memcpy(lpData, buf, sizeof(buf));
HANDLE hFile = OpenFileMapping(FILE_MAP_READ, FALSE, "DataMap");
一个进程打开其它进程创建的共享内存
参数1是用来读,最后一个参数是共享内存的名字
同样将这个共享内存打开后再用MapViewOfFile映射到本进程的虚拟地址空间,就可以读写了。
卸载映射到本进程空间的共享内存