【为了醒目】关于文件映射的问题!!!

nannan50972   2009-11-13 16:31 楼主

  1.   m_hFile = CreateFileForMapping(wcsBuf/*文件地址*/, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL |FILE_FLAG_RANDOM_ACCESS,0);
  2.   
  3.     if (m_hFile == INVALID_HANDLE_VALUE)
  4.     {
  5.         return false;
  6.     }
  7.     // 创建文件映射对象
  8.     m_hFileMap = CreateFileMapping(m_hFile, NULL, PAGE_READONLY, 0, 0, NULL);

  9.     if ((m_hFileMap == NULL) ||  GetLastError() != ERROR_ALREADY_EXISTS)
  10.     {
  11.         [color=#FF0000]LOG_ERROR("Create File Mapping fail !");[/color]
  12.         return false;
  13.     }


以上是一段非常简单的创建文件映射的代码,在WIN32下调试,没有问题。可是每次在PND的WINCE下运行就会出问题,每次都是"Create File Mapping fail !",很是惆怅啊!请教大家,如何处理?

不怕大家笑话,本人刚刚学习编程,属于一级菜鸟。所以请大家尽可能的详细讲解,感激不尽!

回复评论 (23)

学习了
点赞  2009-11-13 16:34
用GetLastErr把错误号打出来看看
点赞  2009-11-13 16:40
还有你是CE5还是CE6?
点赞  2009-11-13 16:43
注意API参数的不同意义.
点赞  2009-11-13 16:52
引用: 引用 2 楼 ruritanian 的回复:
用GetLastErr把错误号打出来看看

错误号:5
点赞  2009-11-13 16:56
引用: 引用 3 楼 ruritanian 的回复:
还有你是CE5还是CE6?

CE4.2
点赞  2009-11-13 16:57
文件大小多大?
点赞  2009-11-13 17:25
引用: 引用 7 楼 ruritanian 的回复:
文件大小多大?

122M
点赞  2009-11-13 17:35
太大了
点赞  2009-11-13 17:37
超过32M肯定有问题
点赞  2009-11-13 17:38
另外,你可以参考CreateFileMapping(SC_CreateFileMapping)的代码:
http://www.2beanet.com/wince/src/COREOS/NK/KERNEL/MAPFILE.C.html
点赞  2009-11-13 17:40
http://www.2beanet.com/wince/src/COREOS/NK/KERNEL/MAPFILE.C.html

牛X,,晕了~~呵
点赞  2009-11-13 17:59
问题还存在
点赞  2009-11-16 09:08
你现在文件多大?
还是同样的问题么?
点赞  2009-11-16 10:18
解决了!

  1.     //映射文件大小
  2.     DWORD iFileSizeHigh = 0;
  3.     DWORD iFileSizeLow  = 0;
  4. #ifdef OS_WINCE
  5.     m_hFile = CreateFileForMapping(wcsBuf, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL |FILE_FLAG_RANDOM_ACCESS,0);
  6.     //取文件大小
  7.     iFileSizeLow = GetFileSize(m_hFile, &iFileSizeHigh);
  8. #else
  9.     m_hFile = CreateFile(wcsBuf, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  10.     //取文件大小
  11.     iFileSizeLow = GetFileSize(m_hFile, &iFileSizeHigh);
  12. #endif
  13.    
  14.     if (m_hFile == INVALID_HANDLE_VALUE)
  15.     {
  16.         LOG_ERROR("OpenFile : CreateFile fail !");
  17.         return false;
  18.     }
  19.     // 创建文件映射对象
  20.     m_hFileMap = CreateFileMapping(m_hFile, NULL, PAGE_READONLY, iFileSizeHigh, iFileSizeLow, NULL);

在WIN32里面iFileSizeHigh和iFileSizeLow可以为0.CE里面貌似不可以!
文件大小无变化还是100多M
点赞  2009-11-16 10:51
CE里这两个值是可以为0的,只不过为0表示将文件整个都map,你文件这么大当然map不了,现在你不设为0,那么就只是map部分,那就可以了。
点赞  2009-11-16 10:58
//取文件大小
iFileSizeLow = GetFileSize(m_hFile, &iFileSizeHigh);

也是整个文件mapping
点赞  2009-11-16 11:06
HANDLE CreateFileMapping(
  HANDLE hFile,
  LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
  DWORD flProtect,
  DWORD dwMaximumSizeHigh,
  DWORD dwMaximumSizeLow,
  LPCTSTR lpName
);

MSDN上面不是说第二个参数要设置为NULL么?
lpFileMappingAttributes
[in] Ignored. Must be NULL.
点赞  2009-11-16 11:15
第二个参数是设为NULL啊
点赞  2009-11-16 11:21
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复