4954|10

81

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

WinCE5.0内存映射文件操作的疑惑 [复制链接]

WinCE5.0内存映射文件操作的疑惑,
有这么一段程序:

  1. // 设定内存映射大小、偏移量等参数
  2. __int64 qwFileSize = 0xD59F80;//文件的最大字节数13.3MB(0xD59F80)/64MB(0x4000000)/128MB(0x8000000)
  3. __int64 qwFileOffset = 0;          //偏移量
  4. __int64 T = 0;                  //阀值
  5. DWORD dwBytesInBlock = 0;         //每次映射的内存大小
  6. __int64 qwLogFileSize = 0;        //日志文件的字节数

  7. //WinCE推荐使用CreateFileForMapping()替代CreateFile()来创建/打开用于内存映射访问的文件
  8.         hFile = CreateFileForMapping(_T("\\Storage Card\\MessageA1")/*path + _T("\\Log.txt")*/,GENERIC_READ/*|GENERIC_WRITE*/,FILE_SHARE_READ/*|FILE_SHARE_WRITE*/,NULL,OPEN_EXISTING/*OPEN_ALWAYS*/,FILE_ATTRIBUTE_READONLY/*FILE_ATTRIBUTE_ARCHIVE*/,NULL);
  9.         if(hFile == NULL)
  10.         {
  11.                 MessageBox(_T("无法创建临时日志文件!\r\n请联系服务提供商!"),_T("ABC"),MB_ICONEXCLAMATION | MB_ICONWARNING | MB_ICONEXCLAMATION);
  12.                 return;
  13.         }
  14.         //创建一个文件映射内核对象
  15.         hMapFile = CreateFileMapping(hFile,    // Current file handle.
  16.                 NULL,                        // Default security.
  17.                 PAGE_READONLY,                // Read ONLY        // PAGE_READWRITE(Read/write permission).
  18.                 0,                        // 文件的最大字节数高32位
  19.                 qwFileSize,                // 文件的最大字节数低32位(此处为13.3MB)
  20.                 NULL);   
  21.         if(hMapFile == NULL)
  22.         {
  23.                 MessageBox(_T("创建临时日志文件映射对象失败,错误代码!\r\n请联系服务提供商!"),_T("ABC"),MB_ICONEXCLAMATION | MB_ICONWARNING | MB_ICONEXCLAMATION);
  24.                 CloseHandle(hMapFile);
  25.                 return;
  26.         }
  27.         //获取部分映射文件视图,在映射时,需要指定映射区域的开始位置qwFileOffset以及映射区域的大小dwBytesInBlock[0表示这个文件映射]
  28.         lpMapView = (PBYTE)MapViewOfFile(hMapFile,FILE_MAP_READ/*FILE_MAP_WRITE*/,(DWORD)(qwFileOffset>>32),(DWORD)(qwFileOffset&0xFFFFFFFF),qwFileSize);
  29.         if(lpMapView == NULL)
  30.         {
  31.                 MessageBox(_T("映射临时日志文件视图失败,错误代码:1\r\n请联系服务提供商!"),_T("ABC"),MB_ICONEXCLAMATION | MB_ICONWARNING | MB_ICONEXCLAMATION);
  32.                 CloseHandle(hFile);
  33.                 CloseHandle(hMapFile);
  34.                 return;
  35.         }
复制代码


本思是想把Storage Card(SD卡)下MessageA1二进制文件映射为内存文件(13.3MB大小),三个步骤中都对文件的属性为只读,这段程序运行正常,但是最终得到的lpMapView数据内存指针所指示的数据区域数据为空百,请问是怎么原因?

谢谢!谢谢!
此帖出自WindowsCE论坛

最新回复

对于CreateFileMapping函数,MSDN里面提到: This function will not work on a Windows CE–based platform that does not support demand paging. 而demand paging的禁使能是在config.bib里面配置的,你查查ROMFLAGS的定义。 Flag Description 0x00000001 Demand paging is disabled. 0x00000002 Disable full-kernel mode. 0x00000010 Trust only modules from the ROM MODULES section. 0x00000020 Use this flag to stop flushing soft TLB (x86 only). 0x00000040 Honor the /base linker setting for DLLs.   详情 回复 发表于 2010-4-7 14:03
点赞 关注
 

回复
举报

75

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
用GetLastError()看看函数执行错误的类型是什么?

可能是内存不足.
此帖出自WindowsCE论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
申请空间是以1MB为基本单位,因此13.3MB是申请不成功的,13.3MB必须取整
此帖出自WindowsCE论坛
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

4
 
三个函数,没有不执行成功的!
三个函数返回的值或句柄都正常!
此帖出自WindowsCE论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 2 楼 domworldjohn 的回复:
申请空间是以1MB为基本单位,因此13.3MB是申请不成功的,13.3MB必须取整


通过语句,

  1. GetSystemInfo(&sysinfo);
  2. //64KB,动态获取当前操作系统的分配粒度
  3. DWORD dwAllocationGranularity = sysinfo.dwAllocationGranularity;
复制代码

得知WinCE操作系统的分配粒度是64KB的
此帖出自WindowsCE论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

6
 
要映射的文件大小为14000000Byte,对应WinCE操作系统的分配粒度是65536Byte的情况,那就在
hMapFile = CreateFileMapping()中设置映射对象大小为14024704Byte(65536Byte*214),但是执行CreateFileMapping()不成功!
GetLastError()返回5,拒绝访问!
何解
此帖出自WindowsCE论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

7
 
关注下。
此帖出自WindowsCE论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

8
 

1. CreateFileForMapping 的返回值不会是 NULL, 失败时是 INVALID_HANDLE_VALUE.

2. CreateFileMapping 失败时的返回值可能是 NULL or ERROR_INVALID_PARAMETER.

Paul, Chao @ Techware
此帖出自WindowsCE论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

9
 
MARK!
此帖出自WindowsCE论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 2 楼 domworldjohn 的回复:
申请空间是以1MB为基本单位,因此13.3MB是申请不成功的,13.3MB必须取整


难道是所要映射的文件要是1MB的整数倍(或是64MB的整数倍)?
此帖出自WindowsCE论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

11
 
对于CreateFileMapping函数,MSDN里面提到:
This function will not work on a Windows CE–based platform that does not support demand paging.

而demand paging的禁使能是在config.bib里面配置的,你查查ROMFLAGS的定义。
Flag Description
0x00000001 Demand paging is disabled.
0x00000002 Disable full-kernel mode.
0x00000010 Trust only modules from the ROM MODULES section.
0x00000020 Use this flag to stop flushing soft TLB (x86 only).
0x00000040 Honor the /base linker setting for DLLs.
此帖出自WindowsCE论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表