[原创] 用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下做的,其他版本应该得到同样效果。
...全文
51 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧