MFC创建内存映射文件示例

2023-11-12

该实例是在程序的exe路径下,实现读取,写入内存映射文件功能

头文件



#ifdef GERNERAL_PRODUCTDATA_EXP
#define GERNERAL_PRODUCTDATA_API _declspec(dllexport)
#else
#define GERNERAL_PRODUCTDATA_API _declspec(dllimport)
#endif // GERNERAL_PRODUCTDATA_EXP



class GERNERAL_PRODUCTDATA_API TestDataFile
{
public:
	TestDataFile();
	~TestDataFile();

public:
	//读取内存映射文件
	static bool ReadMapFile();

	//获取文件中数据
	static SaveTestDataStruct* GetMapFileData();

	//保存内存映射文件
	static bool SaveMapFile();

	//关闭内存映射文件
	static bool CloseMapFile();

private:
	static bool m_bIsOpen;//是否已经打开内存映射文件
	static HANDLE m_hFile;//文件句柄
	static HANDLE m_hMapFile;//内存映射文件句柄
	static LPVOID m_pFileVal;//存储值的指针

};

#endif

源文件

#include "stdafx.h"
#include "TestDataFile.h"

/*-------------全局变量----------------*/
bool TestDataFile::m_bIsOpen = false;

HANDLE TestDataFile::m_hFile=NULL;

HANDLE TestDataFile::m_hMapFile=NULL;
a
LPVOID TestDataFile::m_pFileVal=NULL;


TestData2File::TestDataFile()
{
}


TestData2File::~TestDataFile()
{
}

//得到可执行文件的路径
CString GetExePath(void)
{
	CString strExePath;
	GetModuleFileName(NULL, strExePath.GetBuffer(MAX_PATH), MAX_PATH);
	strExePath.ReleaseBuffer();
	strExePath = strExePath.Left(strExePath.ReverseFind(_T('\\')));
	return strExePath;
}

bool TestDataFile::ReadMapFile()
{
	if (m_bIsOpen)//如果已经读过就不再读
	{
		return true;
	}

	//文件名字
	CString filename1 = GetExePath() + _T("\\MemMap.data");
	

	m_hFile = CreateFile(
		filename1,
		GENERIC_WRITE | GENERIC_READ,          // 写和读文件。
		FILE_SHARE_READ | FILE_SHARE_WRITE,    // 不共享读写。
		NULL,                   // 缺省安全属性。
		OPEN_ALWAYS,          // 如果文件存在,打开文件。如果文件不存在,则创建文件 
		FILE_ATTRIBUTE_NORMAL, // 一般的文件。       
		NULL);

	if (m_hFile == INVALID_HANDLE_VALUE)
	{
		return false;
	}

	m_hMapFile = CreateFileMapping(
		m_hFile, // 如果这值为INVALID_HANDLE_VALUE,是合法的,上步一定测试啊
		NULL, // 默认安全性
		PAGE_READWRITE, // 可读写
		0, // 2个32位数示1个64位数,最大文件字节数,
		// 高字节,文件大小小于4G时,高字节永远为0
		sizeof(SaveTestDataStruct),//dwFileSize, // 此为低字节,也就是最主要的参数,如果为0,取文件真实大小
		NULL);

	if (m_hMapFile == NULL)
	{
		CloseHandle(m_hFile); // 关闭文件
		return false;
	}

	int xlsize = sizeof(SaveTestDataStruct);

	// 步骤3:将文件数据映射到进程的地址空间
	m_pFileVal = MapViewOfFile( //pvFile就是得到的指针,用它来直接操作文件
		m_hMapFile,
		FILE_MAP_WRITE, // 可写
		0, // 文件指针头位置 高字节
		0, // 文件指针头位置 低字节 必为分配粒度的整倍数,windows的粒度为64K
		sizeof(SaveTestDataStruct)); // 要映射的文件尾,如果为0,则从指针头到真实文件尾

	if (m_pFileVal == NULL)
	{
		CloseHandle(m_hMapFile);
		CloseHandle(m_hFile);
		return false;
	}

	m_bIsOpen = true;
	return m_bIsOpen;

}

SaveTestDataStruct* TestDataFile::GetMapFileData()
{
	if (!m_bIsOpen)
	{
		return NULL;
	}

	return (SaveTestDataStruct*)m_pFileVal;
}

bool TestDataFile::SaveMapFile()
{
	if (!m_bIsOpen)
	{
		return false;
	}
	//将内存保存在文件中
	FlushViewOfFile(m_pFileVal, sizeof(SaveTestDataStruct));

	return true;
}

bool TestDataFile::CloseMapFile()
{
	if (!m_bIsOpen)
	{
		return false;
	}

	m_bIsOpen = false;

	UnmapViewOfFile(m_pFileVal); // 释放内存映射文件的头指针
	CloseHandle(m_hMapFile); // 内存映射文件句柄
	CloseHandle(m_hFile); // 关闭文件
	return true;
}

自定义一个数据结构


//保存测试结果的结构体
typedef struct tagSaveTestDataStruct
{
	CapCarrier AllCapCarrier[TOTAL_CAR_NUM];   
	CapCarrier TestOutCarrier[TEST_OUTCAR_NUM];

        ..//还有很多类型,这里不一一列举

	int nEsrRecpNo;
	bool bCanFeed;

}SaveTestDataStruct;

使用该类来读取文件

/读取内存映射文件
void VisionMotionInterface::ReadMemMapFile()
{
	//读取内存映射文件
	if (!TestDataFile::ReadMapFile())
	{
		HMIMsgBoxCenter(__FUNCTION__ +_T("中ReadMapFile失败!"), HMI_MSG_OK);		
		return;
	}	

	//获取结果
	SaveTestDataStruct* tempData = TestDataFile::GetMapFileData();

	//进料模块
	for (int i=0;i< FEED_CAP_NUM;i++)
	{
		m_CapFeedMotion.tCapFeedMove.FeedCaryTestData[i] = tempData->FeedInResult[i];//进料数据
		
	}
	
}

使用该类来写入文件

//获取结果
void VisionMotionInterface::SaveMemMapFile()
{
   SaveTestDataStruct* tempData = TestData2File::GetMapFileData();

	
	//开短路仪表的配方参数
	  tempData->nOSRecpNo=m_CapFeedMotion.tCapFeedMove.nOSMeterRecipeNo;

	//ESR仪表的配方参数
	  tempData->nEsrRecpNo=m_CapFeedMotion.tCapFeedMove.nESRMeterRecipeNo;

	  //是否可以进料
	  tempData->bCanFeed =m_CapFeedMotion.tCapFeedMove.bCanFeed;


	TestData2File::SaveMapFile();
	TestData2File::CloseMapFile();
	m_runlog.addRunLog(_T("保存内存映射文件成功!"));

}
	

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MFC创建内存映射文件示例 的相关文章

  • 支持 IAccesible 接口以在文本编辑器中移动插入符号的正确解决方案是什么?

    我想从头开始实现一个支持 IAccessible 接口的文本编辑器 我正在使用 MFC 和 Win32 API 当记事本等标准文本编辑器中的插入符号位置发生变化时 讲述人 JAWS 等客户端工具将发音与插入符号移动相对应的字母 单词或行 我
  • MFC/WinAPI 的大问题

    我需要创建一个带有两个选项卡的表单视图的 SDI 表单 其中封装了多个对话框作为选项卡内容 但表格必须有彩色背景 诸如此类的事情让我讨厌编程 首先 我通过资源编辑器尝试了 CTabControl 尝试了不同的事情 但未记录的行为和没有答案的
  • 安装VS2008后,在winnt.h中出现编译错误

    我正在尝试将我们的项目从 VS2005 转移到 VS2008 并且在 MFC 项目上遇到此构建错误 C Program Files Microsoft SDKs Windows v6 0A include winnt h 236 error
  • 在 Visual Studio 2013 中显示带有偏移量的控件

    最近 我将源代码从 Visual Studio 2010 迁移到 Visual Studio 2013 在 Visual Studio 2013 中构建后 控件将显示有偏移 单击下面的链接查看图像 链接到图像 https i stack i
  • 寻找 C++ 中搜索和替换的圣杯

    最近 我正在寻找一种替换字符串中标记的方法 这本质上是查找和替换 但至少还有一种解决问题的方法 看起来像是相当平庸的任务 我已经提出了几种可能的实现 但从性能的角度来看 它们都不能令人满意 最好的成绩是每次迭代约 50us 这种情况很理想
  • 有效的 MFC ID 范围

    这让我很困惑 我正在读这个技术说明 https learn microsoft com en gb cpp mfc tn020 id naming and numbering conventions它指出 Prefix Resource t
  • dll 中的 MFC LoadString 失败

    我在 dll 中有一个静态函数 它使用 LoadString 从资源加载字符串 当我从该 dll 调用此函数时 一切正常 但是 当我从其他模块 activeX 控件 调用此函数时 LoadString 失败并出现错误 ERROR RESOU
  • GetWindowRect 坐标不与屏幕相关

    我正在使用 Visual Studio 2008 C 工作 我有一个 MFC 对话框 里面有一个控件 我正在尝试在控件中放置另一个对话框 第二个对话框上的 SetWindowPos 显然使用屏幕坐标 因此我需要获取控件或父对话框的屏幕坐标
  • Boost::序列化和 MFC Doc/View 架构

    我正在移植现有的 MFC C 应用程序以对 XML 文件使用 Boost Serialization 我的 CDocument 对象包含应用程序的所有数据 我已将序列化函数实现为 template
  • 具有透明背景的CWnd

    我想创建一个基于 CWnd 的类 它将引入具有透明背景的控件 只要内容是静态的 创建一个控件并用透明背景绘制其内容对我来说没什么大不了的 问题是当我想创建一个内容不断变化的控件时 这是因为我不知道如何用父背景删除控件的内容 一般情况下可能不
  • 从不同操作系统检索到的故障转储指向消息循环。如何从那里到达故障位置? (TeamViewer 使我的进程崩溃。)

    我们软件的一位客户抱怨说 该软件在他的 Windows XP 计算机上崩溃了 我让他下载ProcDump https technet microsoft com en us sysinternals dd996900 aspx并按如下方式运
  • 将简单的 MFC CView/CDocument/CSingleDocTemplate 应用程序转换为 ActiveX 控件

    我有一个相当简单的 MFC 应用程序 它只定义了自己的子类CDocument CView and CFrameWnd并通过使用它们CSingleDocTemplate在视图的树中显示文档的只读内容 都是非常标准的MFC MVC 我现在需要转
  • 如何在 MFC 中创建 GUI

    我需要能够即时创建指南 MFC中有没有办法做到这一点 我了解了如何在 net 中做到这一点 但我们还没有做到这一点 如果没有 您是否有一些我可以使用的代码的指针 don t forget to add Rpcrt4 lib to your
  • 如何将基数词转换为序数词

    有没有一种简单的方法可以将数字 1 2 3 转换为 1st 2nd 3rd 并且以这种方式我可以为该函数提供一种语言并具有它会返回我目标语言的正确形式吗 标准 C stl 或 boost 都可以 MFC 或 ATL win32 api 或我
  • MFC CMenu 工具提示未显示

    我尝试使用类似的东西来设置 CMenu 项的工具提示 如所述here https stackoverflow com questions 2400180 mfc how to add tooltip in cmenu items 但它只是显
  • 获取正在运行的程序的属性

    我想开发一个程序 其 ID 是一张牌 因为它在另一个正在运行的程序 例如扑克或红心游戏或其他程序 中播放 我首先尝试获取有关已运行的游戏程序的所需信息 但我从一开始就遇到了问题 我正在运行 MSVC 2013 并开发 MFC 应用程序 现在
  • 对 MFC UI 应用程序进行单元测试吗?

    如何对大型 MFC UI 应用程序进行单元测试 我们有一些大型 MFC 应用程序已经开发了很多年 我们使用一些标准的自动化 QA 工具来运行基本脚本来检查基础知识 文件打开等 这些由 QA 小组在日常构建后运行 但我们希望引入一些程序 以便
  • C++ 检查 unicode 字符是否为全角

    如何检查unicode字符是否是全角 我使用Win32 MFC 例如 中是全宽 A不是全角 是全宽 F不是全宽 你需要的是检索东亚宽度 http www unicode org reports tr11 的角色 您可以通过解析来做到这一点东
  • Create CFrameWnd 给出了第一次机会异常——为什么?

    我正在尝试使用基于 CFrameWnd 的代码编写一个简单的 MFC 应用程序 该应用程序在可滚动窗口中绘制 下面的代码改编自 Prosise Programming Windows with MFC 第 2 版 第 89ff 页 当我在调
  • 具有键唯一性和按位置排序的 MFC 字典集合

    看着表上http msdn microsoft com en us library y1z022s1 28v vs 80 29 aspx core collection shape features http msdn microsoft

随机推荐

  • 十大最佳虚拟化软件

    正如该术语在计算术语中暗示的那样 虚拟化涉及到创建虚拟操作系统 网络平台和存储设备 当今世界 需要复杂的计算机系统来帮助管理大型企业 虚拟化帮助计算机系统和网络管理员使用相同的硬件运行并行操作系统进程 这意味着硬件和软件集成的有效使用 它还
  • centos 查看内核 版本

    查看系统内核版本 方法一 root multiview cat proc version Linux version 3 10 0 693 el7 x86 64 builder kbuilder dev centos org gcc ver
  • Linux下C语言使用openssl库进行MD5校验

    作者 无脑仔的小明 出处 http www cnblogs com wunaozai 我们以一个字符串为例 新建一个文件filename txt 在文件内写入hello 然后在Linux下可以使用命令md5sum filename txt计
  • 2.3mnist手写数字识别之网络结构精讲(百度架构师手把手带你零基础实践深度学习原版笔记系列)

    2 3mnist手写数字识别之网络结构精讲 百度架构师手把手带你零基础实践深度学习原版笔记系列 目录 2 3mnist手写数字识别之网络结构精讲 百度架构师手把手带你零基础实践深度学习原版笔记系列 概述 经典的全连接神经网络 卷积神经网络
  • [SQL]SQL server 常用代码

    判断数据库是否存在 USE eshop 选取数据库 GO IF EXISTS SELECT FROM sysdatabases WHERE name eshop 判断eshop是否存在 DROP DATABASE eshop 删除 GO 新
  • Cisco路由器 VOIP 配置

    Cisco路由器VOIP 配置解析 在企业网络中推广IP语音技术有很多优点 例如可以控制数据流量 保证语音质量 充分利用企业租用的数据线路资源 节省传统的长途话费等等 企业使用IP语音技术 可以将语音 数据和多媒体通信融合在一个集成的网络中
  • 玩转Mixly – 2、Arduino AVR编程 之 输入输出

    以下内容源自Mixly官方技术文档 https mixly readthedocs io zh CN latest Arduino AVR 01Input Output html 输入 输出 输入 输出所包含的指令主要分为四部分 控制管脚的
  • CSS 轻松搞定标签(元素)居中问题

    在CSS里 标签位置居中一直是困扰Web前端的难题 在本文中 我对这类问题进行了探究和给出了几点建议 供读者参考 1 行内标签 1 1 水平居中 在父级标签中使用 text align center 效果 1 2 垂直居中 如果是单行 则为
  • 工业级路由器和家用路由器的区别_5G工业级路由器有哪些优势

    一 5G工业级路由器比4G工业级路由器强在哪 对于消费者而言 5G的价值在于它拥有比4G LTE更快的速度 峰值速率可达几十Gbps 例如你可以在一秒钟内下载一部高清电影 而4G LTE可能要10分钟 5G网关 5G路由 因而 和4G工业级
  • Mysql中行转列和列转行

    一 行转列 即将原本同一列下多行的不同内容作为多个字段 输出对应内容 建表语句 DROP TABLE IF EXISTS tb score CREATE TABLE tb score id INT 11 NOT NULL auto incr
  • C语言的关键字,字符和ASCII码

    关键字的介绍 C语言的关键字有 1 数据类型关键字 2 控制语句关键字 3 存储类型关键字 4 其他关键字 数据类型关键字有12个 char 声明字符型变量或函数 double 声明双精度变量或函数 enum 声明枚举类型 float 声明
  • 10-11

    函数 函数体内部的语句在执行时 一旦执行到return时 函数就执行完毕 并将结果返回 因此 函数内部通过条件判断和循环可以实现非常复杂的逻辑 如果没有return语句 函数执行完毕后也会返回结果 只是结果为undefined 定义方法一
  • ROS笔记 URDF及rviz可视化及遇到的问题

    在学习http gazebosim org tutorials tut ros urdf中遇到一些问题 因为版本不同出现错误 GazeboRosControlPlugin missing while using DefaultRobotHW
  • FIO 磁盘性能测试

    FIO 磁盘性能测试 fio 是一个开源压力测试工具 主要用来测试硬盘 io 性能 这个工具的可定制性非常强 可以根据测试者的想法进行各种混合 io 测试 它支持 13 种不同类型 io 引擎 libaio sync mmap posixa
  • 系统设计感悟

    author skate time 2012 07 26 系统设计感悟 总结以往教训 以后再设计系统时注意点 首先考虑 系统不同的服务对象的定位 比如优先级等 系统的考核指标定位 性能 稳定 扩展伸缩 再次设计系统时必须考虑 1 控制表的数
  • C++语言入门3(定义整数与整数输入)

    关于整数 c 是一个对定义要求很严格的语言 对于数的定义也有很多种 比如整数 浮点数 整数不言而喻 不含有小数点 关于整数的定义也有很多种 最常用的无疑是int 我们定义整数一般选择的是int int可以表示的整数范围可以达到2 32 1
  • ESP32调试笔记

    1 现象 上电后一直复位 rst 0x3 SW RESET boot 0x13 SPI FAST FLASH BOOT 原因 Flash烧录时 ota data和app0位置错了 解决 把ota data和app0位置烧录正确即可 位置从分
  • 【vue3总结知识点——精简一】

    vue3总结知识点 认识vue3 Composition API setup 执行时机 setup 包含的生命周期 ref获取页面数据 reactive reactive与ref的异同 比较Vue2与Vue3的响应式 vue2的响应式 Vu
  • 组合数打表模板

    组合数打表模板 组合数打表模板 适用于N lt 3000c i j 表示从i个中选j个的选法 1 2 3 4 5 6 7 8 9 10 11 12 long long C N N const int mod 1e9 5 void get C
  • MFC创建内存映射文件示例

    该实例是在程序的exe路径下 实现读取 写入内存映射文件功能 头文件 ifdef GERNERAL PRODUCTDATA EXP define GERNERAL PRODUCTDATA API declspec dllexport els