WinCE5.0内存映射文件操作的疑惑,
有这么一段程序:
- C/C++ code
// 设定内存映射大小、偏移量等参数__int64 qwFileSize = 0xD59F80;//文件的最大字节数13.3MB(0xD59F80)/64MB(0x4000000)/128MB(0x8000000)__int64 qwFileOffset = 0; //偏移量__int64 T = 0; //阀值DWORD dwBytesInBlock = 0; //每次映射的内存大小__int64 qwLogFileSize = 0; //日志文件的字节数//WinCE推荐使用CreateFileForMapping()替代CreateFile()来创建/打开用于内存映射访问的文件 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); if(hFile == NULL) { MessageBox(_T("无法创建临时日志文件!\r\n请联系服务提供商!"),_T("ABC"),MB_ICONEXCLAMATION | MB_ICONWARNING | MB_ICONEXCLAMATION); return; } //创建一个文件映射内核对象 hMapFile = CreateFileMapping(hFile, // Current file handle. NULL, // Default security. PAGE_READONLY, // Read ONLY // PAGE_READWRITE(Read/write permission). 0, // 文件的最大字节数高32位 qwFileSize, // 文件的最大字节数低32位(此处为13.3MB) NULL); if(hMapFile == NULL) { MessageBox(_T("创建临时日志文件映射对象失败,错误代码!\r\n请联系服务提供商!"),_T("ABC"),MB_ICONEXCLAMATION | MB_ICONWARNING | MB_ICONEXCLAMATION); CloseHandle(hMapFile); return; } //获取部分映射文件视图,在映射时,需要指定映射区域的开始位置qwFileOffset以及映射区域的大小dwBytesInBlock[0表示这个文件映射] lpMapView = (PBYTE)MapViewOfFile(hMapFile,FILE_MAP_READ/*FILE_MAP_WRITE*/,(DWORD)(qwFileOffset>>32),(DWORD)(qwFileOffset&0xFFFFFFFF),qwFileSize); if(lpMapView == NULL) { MessageBox(_T("映射临时日志文件视图失败,错误代码:1\r\n请联系服务提供商!"),_T("ABC"),MB_ICONEXCLAMATION | MB_ICONWARNING | MB_ICONEXCLAMATION); CloseHandle(hFile); CloseHandle(hMapFile); return; }
本思是想把Storage Card(SD卡)下MessageA1二进制文件映射为内存文件(13.3MB大小),三个步骤中都对文件的属性为只读,这段程序运行正常,但是最终得到的lpMapView数据内存指针所指示的数据区域数据为空百,请问是怎么原因?
谢谢!谢谢!
------解决方案--------------------
用GetLastError()看看函数执行错误的类型是什么?
可能是内存不足.
------解决方案--------------------
申请空间是以1MB为基本单位,因此13.3MB是申请不成功的,13.3MB必须取整
------解决方案--------------------
关注下。
------解决方案--------------------
1. CreateFileForMapping 的返回值不会是 NULL, 失败时是 INVALID_HANDLE_VALUE.
2. CreateFileMapping 失败时的返回值可能是 NULL or ERROR_INVALID_PARAMETER.
Paul, Chao @ Techware
------解决方案--------------------
MARK!
------解决方案--------------------
对于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.