QT进程通信(二)——VC共享内存

48 篇文章 0 订阅
#include "windows.h"
#include "stdio.h"
#pragma warning(disable:4996)
void CSharedMemoryDlg::OnBnClickedOk()
{
	// TODO: 在此添加控件通知处理程序代码
	//CDialogEx::OnOK();

	//1.先创建一个文件 CreateFile,即共享内存的实体
	HANDLE hFile = CreateFile(TEXT("E:\zj.dat"), GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
	if (hFile == NULL) {
		printf("create file error!");
		return;
	}
	// HANDLE hFile = (HANDLE)0xffffffff; //创建一个进程间共享的对象
	//2.创建内存映射文件,上述硬盘中的文件hFile映射成为一个虚拟的映射文件 hMap ,即将物理文件与虚拟文件绑定,或者理解成将硬盘中的文件映射到内存当中。
	HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 1024 * 1024, TEXT("ZJ"));
	int rst = GetLastError();
	if (hMap != NULL && rst == ERROR_ALREADY_EXISTS) {
		printf("hMap error\n");
		CloseHandle(hMap);
		hMap = NULL;
		return;
	}
	//3.加载并获得内存映射文件 MapViewOfFile 在内存中的地址
	CHAR* pszText = NULL;
	pszText = (CHAR*)MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 1024 * 1024);
	if (pszText == NULL) {
		printf("view map error!");
		return;
	}
	//4.使用内存,即使用文件
	sprintf(pszText, "hello my first mapping file!\n"); //其实是向文件中(共享内存中)写入了
	while (1) {
		printf(pszText);   //读
		Sleep(3000);
	}
	getchar();
	//卸载映射,关闭文件
	UnmapViewOfFile((LPCVOID)pszText);
	CloseHandle(hMap);
	CloseHandle(hFile);
	
}


void CSharedMemoryDlg::OnBnClickedCancel()
{
	// TODO: 在此添加控件通知处理程序代码
	//CDialogEx::OnCancel();

	//1.打开内存映射文件(虚拟文件)
	HANDLE hMap = OpenFileMapping(FILE_MAP_ALL_ACCESS, TRUE, TEXT("ZJ"));
	if (hMap == NULL) {
		printf("open file map error!");
		return;
	}
	//2.获得地址,映射成内存 MapViewOfFile和服务器中的一样
	CHAR* pszText = NULL;
	pszText = (CHAR*)MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 1024 * 1024);    
	if (pszText == NULL) {
		printf("map view error!\n");
		return;
	}
	//3.使用内存
	printf(pszText); //从文件中读(共享内存)         
	sprintf(pszText, "second data!\n"); //写入    
	getchar();
	//4.关闭映射,关闭文件。同服务器
	UnmapViewOfFile(pszText);
	CloseHandle(hMap);
	hMap = NULL;
	return;
	
}

原文地址,非常棒

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值