exe文件间的内存共享

示例:

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

int main(void)
{
	HANDLE hFileMap;
	HANDLE hEvent;

	hEvent = CreateEvent(NULL, false, false, TEXT("MyEvent"));//开辟事件
	if (hEvent == NULL)
	{
		printf("createEvent failed\n");
		return 0;
	}
	hFileMap = CreateFileMapping((HANDLE)INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0,1024, TEXT("MyShareData"));//创造名为MyShareData的映射空间 
	if (hFileMap == NULL)
	{
		printf("createfilemapping failed\n");
		return 0;
	}
	//float *pcMap为浮点型的指针
	float *pcMap = (float *)MapViewOfFile(hFileMap, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);//创造映射空间的指针,
	if (pcMap == NULL)
	{
		printf("MapViewOfFile failed\n");
		CloseHandle(hFileMap);
		return 0;
	}

	for (int i = 0; i < 10;i++)
	{
		pcMap[i] = i;//通过指针向内存空间赋值
	}

	UnmapViewOfFile(pcMap);//删除映射内存
	CloseHandle(hFileMap);

	SetEvent(hEvent);//设置无信号状态
	CloseHandle(hEvent);//关闭句柄值

	return 1;
}

方法一 不太管用

#include <windows.h>
#include <iostream>
using namespace std;
int main(void)
{
	HANDLE hMySharedMapFile = OpenFileMapping(FILE_MAP_WRITE|FILE_MAP_READ, false, TEXT("MyShareData"));//以读和写的方式打开名为MyShareData的映射空间
	float* pcMap;
	pcMap = (float*)MapViewOfFile(hMySharedMapFile, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);//创建映射空间的指针
	//读取映射时需要先有映射空间,否则内存读取失败
	for (int i = 0; i < 10; i++)
	{
		cout << pcMap[i] << endl;//输出,显示
	}
	pcMap[1] = 3;
	UnmapViewOfFile(pcMap);//删除映射空间
	CloseHandle(hMySharedMapFile);//关闭映射空间句柄

	return 1;
}

方法二:还是需要重新创建事件,开辟映射空间,创建指针,输出

 HANDLE hFileMap;
		 HANDLE hEvent;
		 int processValue=0;
		 int* pcMap;//指针的新建最好放外面,要么会一直新建空间进行存储
		 while (true)
		 {
			 hEvent = CreateEvent(NULL, false, false, TEXT("MyEvent"));//开辟事件
			 if (hEvent == NULL)
			 {
				 printf("createEvent failed\n");
				 continue;
			 }
			 hFileMap = CreateFileMapping((HANDLE)INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 1024, TEXT("MyShareData"));//创造名为MyShareData的映射空间 
			 if (hFileMap == NULL)
			 {
				 continue;
			 }
			 pcMap = (int*)MapViewOfFile(hFileMap, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);//创建映射空间的指针
			 processValue = pcMap[0];
			 ui->progressBar->setValue(processValue);
			 if (processValue == 100)
			 {
				 *pcMap = 0;//一定要将指针置零,否则该指针指向上次程序运行结果的的内存
				 UnmapViewOfFile(pcMap);//删除映射空间
				 CloseHandle(hFileMap);//关闭映射空间句柄* /
				 CloseHandle(hEvent);//关闭映射空间句柄* /
				 QMessageBox::information(this, QString::fromLocal8Bit("提示窗口"), QString::fromLocal8Bit("计算结束     "));
				 break;
			 }
		 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值