内存映射文件 进程间通讯

通过内存映射文件完成两个进程间的通讯:


先运行进程A,进程A中创建一个文件映射,创建View,再将映射文件中的数据修改为一个字符串,然后
循环检测映射文件中的第一个字节,如果不为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;
}


进程B代码:

// 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;
}



你可能感兴趣的:(学习笔记)