[原创] 用FileMapping方式实现进程间通信
erx 2003-10-17 02:36:58 在Win平台下,实现进程间通信有多种方法,例如共享内存、管道、套接字、远程过程调用、发送消息等等。但最正点的,还是共享内存这种方法。
下面是具体实现的代码:
t1.c
===============================================
#include<stdio.h>
#include<windows.h>
void main()
{
HANDLE hMem;
LPBYTE lpData;
// 创建文件映像对象
hMem=CreateFileMapping(INVALID_HANDLE_value, 0, PAGE_READWRITE, 0, 1024, "Test");
if(hMem==NULL)
{
printf("CreateFileMapping Error\n");
return;
}
// 将文件映射对象的视图映射进地址空间
lpData = (LPBYTE)MapViewOfFile(hMem, FILE_MAP_WRITE, 0, 0, 0);
if(hMem==NULL)
{
CloseHandle(hMem);
printf("MapViewOfFile Error\n");
return;
}
// 将数据复制到共享内存
memcpy(lpData, "Hello from t1", sizeof("Hello from t1"));
printf("Waiting for t2 to fetch data.\nPress any key to exit.\n");
system("pause");
UnmapViewOfFile(lpData);
CloseHandle(hMem);
return;
}
t2.c
===============================================
#include<stdio.h>
#include<windows.h>
void main()
{
HANDLE hMem;
LPBYTE lpData;
char *buf;
// 打开文件映像对象
hMem=OpenFileMapping(FILE_MAP_WRITE, FALSE, "Test");
if(hMem==NULL)
{
printf("OpenFileMapping Error\n");
return;
}
// 将文件映射对象的视图映射进地址空间
lpData=(LPBYTE)MapViewOfFile(hMem, FILE_MAP_WRITE, 0, 0, 0);
if(hMem==NULL)
{
CloseHandle(hMem);
printf("MapViewOfFile Error\n");
return;
}
// 将共享内存的数据复制出来
buf=strdup((char*)(lpData));
printf("The data from t1: %s",buf);
UnmapViewOfFile(lpData);
CloseHandle(hMem);
return;
}
编译后,开两个DOS窗口,一个先运行t1,然后另一个再运行t2。
t1
===============================================
C:\t\t1\Debug>t1
Waiting for t2 to fetch data.
Press any key to exit.
请按任意键继续 . . .
C:\t\t1\Debug>
t2
===============================================
C:\t\t2\Debug>t2
The data from t1: Hello from t1
C:\t\t2\Debug>
我在Win2K VC++6下做的,其他版本应该得到同样效果。