进程通信之文件读写

文件也可以用来作为进程通信的工具,

1.创建 读取者程序

// InterProcess_Communucation_FILE_READER.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <stdio.h>
using namespace std;

//约定文件名
#define FILE_NAME TEXT("d:\\tempfile.dat")

//约定用于同步发送端和接收端的事件对象名
#define NOTE_EVENT_NAME TEXT("tempfileEVENT")
//获取用于同步发送端和接收端的事件对象
HANDLE hEvent = CreateEvent(NULL,TRUE,FALSE,NOTE_EVENT_NAME);

VOID RefreshView(HANDLE hFile )
{
	system("cls");


	DWORD dwRet = 0;
	UINT len = GetFileSize(hFile,NULL);
	SetFilePointer(hFile,0,NULL,FILE_BEGIN);
	LPWSTR lpwstr = (LPWSTR)calloc(len,sizeof(char));
	if(!ReadFile(hFile,lpwstr,len,&dwRet,NULL))
		wcout << L"读取内容失败\n";
	UINT characters = len / sizeof(WCHAR);
	for(int i = 0; i < characters-1; i++)
	{
		if(lpwstr[i] == 0)
			lpwstr[i] = L'\n';
	}

	wcout << lpwstr << endl;

	ResetEvent(hEvent);
}


BOOL ReadFromFile(WCHAR* lpwstr )
{
	//wcout的使用需要设置语言环境
	setlocale(LC_ALL,"chs");

	//获取 同一主机上发送端和接受端文件约定名称的文件句柄
	HANDLE hFile = CreateFile(FILE_NAME,GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

	if(hFile == INVALID_HANDLE_VALUE)
	{
		DWORD dwErr = GetLastError( );
		if(dwErr == ERROR_ACCESS_DENIED)
			//如果错误码是access_denied说明权限不够,程序需要运行在管理员提权 情况下,
			wcout << TEXT("you must elevate you privilege!\n");
		wcout << TEXT("Cannot get the file handle! exit\n");
		system("pause");
		return 0;
	}
	while(1)
	{
		DWORD dwRet = WaitForSingleObject(hEvent,INFINITE);
		if(dwRet == WAIT_OBJECT_0)
		{
			RefreshView(hFile);
		}
	}
	
	//实际上是个死循环,不可能执行到这里来,自然也就不用关闭句柄了,因为程序结束了,系统会自动释放进程占用的所有资源
	CloseHandle(hFile);
}


int _tmain(int argc, _TCHAR* argv[])
{
	ReadFromFile(FILE_NAME);
	return 0;
}


2.创建写入者程序

#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <stdio.h>
using namespace std;
//约定文件名
#define FILE_NAME TEXT("d:\\tempfile.dat")


//约定用于同步发送端和接收端的事件对象名
#define NOTE_EVENT_NAME TEXT("tempfileEVENT")

//用于同步发送端和接收端的对象
HANDLE hEvent = CreateEvent(NULL,TRUE,FALSE,NOTE_EVENT_NAME);

int _tmain(int argc, _TCHAR* argv[])
{

	//wcout的使用需要设置语言环境
	setlocale(LC_ALL,"chs");

	//获取 同一主机上发送端和接受端文件约定名称的文件句柄
	HANDLE hFile = CreateFile(FILE_NAME,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
	if(hFile == INVALID_HANDLE_VALUE)
	{
		DWORD dwErr = GetLastError( );
		if(dwErr == ERROR_ACCESS_DENIED)
			//如果错误码是access_denied说明权限不够,程序需要运行在管理员提权 情况下,
			wcout << TEXT("you must elevate you privilege!\n");

		wcout << TEXT("Cannot get the file handle! exit\n");
		system("pause");
		return 0;
	}
	DWORD size = GetFileSize(hFile,NULL);
	SetFilePointer(hFile,0,NULL,FILE_END);
	while(1)
	{
		
		wcout << TEXT("\n请输入字符串:") << endl;
		//每一次循环,获取一行输入
		WCHAR wch[MAX_PATH] = {0};
		wcin.getline(wch,MAX_PATH);

		UINT len = (lstrlen(wch) + 1)*sizeof(WCHAR);
		DWORD dwRet = 0;
		if(!WriteFile(hFile,(LPVOID)wch,len,&dwRet,NULL))
		{
			wcout<<TEXT("\nCannot write informatin into the file\n");
		}
		wcout << TEXT("Write information succeed!\n");
		
		wcout << L"\n退出否?y or n:" << endl;
		WCHAR ch[2] = {0};
		wcin.getline(ch,2) ;
	
		if(ch[0] == L'y')
			//输入小写y退出 写入文件
			break;
		SetEvent(hEvent);
	}
	CloseHandle(hFile);
	return 0;
}


实验截图(先运行输入者,再运行读取者)






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值