文件也可以用来作为进程通信的工具,
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;
}
实验截图(先运行输入者,再运行读取者)