通过内存映射文件完成两个进程间的通讯:
循环检测映射文件中的第一个字节,如果不为0,就一直循环检测,直到为0才退出循环,并关闭文件映
射句柄、结束进程。
后运行进程B,打开进程A创建的文件映射,创建View,通过MessageBox显示出映射文件中的字符串。然
后修改映射文件第一个字符为0,此时,A进程就会检测到,并退出A进程的循环,从而结束掉A进程。
进程A代码:
// Mapping_A.cpp : 定义控制台应用程序的入口点。
// 进程A共享数据
#include "stdafx.h"
#include "Windows.h"
int _tmain(int argc, _TCHAR* argv[])
{
//1.创建命名的文件映射
HANDLE hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0, 16,
_T("File_Mapping_Test"));
if (hMapFile == nullptr || hMapFile == INVALID_HANDLE_VALUE)
{
return FALSE;
}
//2.创建View
PVOID pBuf = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 16);
if (pBuf==nullptr)
{
return FALSE;
}
//3.将共享数据复制到映射文件中
_tcscpy_s((TCHAR*)pBuf, 6, _T("测试文本"));
//4.循环等待
while (*((PBYTE)pBuf))
{
Sleep(200);
}
//5.取消Mapping,关闭句柄
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
return 0;
}
// Mapping_B.cpp : 定义控制台应用程序的入口点。
// 进程B,访问进程A
#include "stdafx.h"
#include "Windows.h"
int _tmain(int argc, _TCHAR* argv[])
{
//1.打开文件Mapping
HANDLE hMapFile = OpenFileMapping(
FILE_MAP_ALL_ACCESS,
FALSE,
_T("File_Mapping_Test"));
if (hMapFile == nullptr)
{
return FALSE;
}
//2.创建View
PVOID pBuf = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 16);
if (pBuf == nullptr)
{
return FALSE;
}
//3.显示共享数据
MessageBox(NULL,(LPCTSTR)pBuf, _T("FileMapping"), MB_OK);
//4.修改共享数据
*((PBYTE)pBuf) = 0;
//5.取消Mapping,关闭句柄
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
return 0;
}