首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > WinCE >

WinCE5.0内存映射文件操作的疑惑解决思路

2012-02-10 
WinCE5.0内存映射文件操作的疑惑WinCE5.0内存映射文件操作的疑惑,有这么一段程序:C/C++ code// 设定内存映

WinCE5.0内存映射文件操作的疑惑
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. 

热点排行