进程通信之文件读写

来源:互联网 发布:中国网络零售交易额 编辑:程序博客网 时间:2024/05/17 06:15

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

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


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






0 0
原创粉丝点击