【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
在通信协议的开发中,有的时候为了本地调试的需要,需要实现进程之间的通信。在windows系统中,进程通信的方式很多,比如说有管道通信、内存映射、socket通信、剪切板通信等等。但是,其中,我认为最好的方式还是内存映射的方式,简单、明了。因为通信的数据是被很多进程共享的,所以必要的互斥措施是非常必要的。只要处理好互斥的关系,内存映射可以为我们做好不少事情。
在内存映射中,所需要的基本函数其实非常简单:(1)创建文件映射,即函数CreateFileMapping;(2)打开文件映射,即函数OpenFileMapping;(3)关闭文件映射,即函数UnmapViewOfFile。名称是server和client识别的唯一媒介。下面就是一个范例,贴出来的代码是一个简单的服务端和客户端代码,略带修改。源代码来自于《精通Windows API,函数、接口、编程实例》,请注意版权声明。
服务端代码如下所示,
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#define BUF_SIZE 256
LPTSTR szName = TEXT("mapObject");
LPTSTR szMsg = TEXT("msg");
void main(int argc, char* argv[])
{
HANDLE hMapFile;
LPTSTR pBuf;
hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
BUF_SIZE,
szName
);
if(hMapFile == NULL || hMapFile == INVALID_HANDLE_VALUE)
{
return;
}
pBuf = (LPSTR)MapViewOfFile(hMapFile,
FILE_MAP_ALL_ACCESS,
0,
0,
BUF_SIZE);
if(NULL == pBuf)
{
return ;
}
CopyMemory(pBuf, szMsg, strlen(szMsg));
getch();
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
}
客户端代码如下,
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#pragma comment (lib, "User32.lib")
#define BUF_SIZE 256
LPTSTR szName = TEXT("mapObject");
void main(int argc, char* argv[])
{
HANDLE hMapFile;
LPTSTR pBuf;
hMapFile = OpenFileMapping(
FILE_MAP_ALL_ACCESS,
FALSE,
szName
);
if(hMapFile == NULL )
{
return ;
}
pBuf = (LPSTR)MapViewOfFile(hMapFile,
FILE_MAP_ALL_ACCESS,
0,
0,
BUF_SIZE);
if(NULL == pBuf)
{
return ;
}
printf(pBuf);
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
}