内存映射文件CreateFileMapping的问题,急。。

jianpanlanyue 2012-11-24 08:12:16
我想写个分区逐扇区扫描的功能,之前使用CreateFile(“\\\\.\\D:”,...),是可以的,后来考虑到用ReadFile,WriteFile效率太差,决定一试内存映射文件。
但问题来了,CreateFile()这一步是成功的,但到了CreateFileMapping()时总报错,用GetLastError()查了下错误码,说是“参数不正确”。
将CreateFile(“\\\\.\\D:”,...)换成某个文件的话,比如CreateFile(“\\\\.\\D:\\aaa.dat”,...),再CreateFileMapping()就是成功的。期间,由于报错说“参数不正确”,我把这几个函数的访问属性GENERIC_READ,WRITE FILE_SHARE_READ,WRITE之类的反复调换,还是不行。也不是磁盘太大,内存不够的问题,后面将D盘换成几十兆的E盘也不行。难不成是内存映射文件只能映射文件,不能像CreateFile,ReadFile一样支持读写分区?不把设备当文件?
下面是代码片段:
HANDLE hDevice = CreateFile(_T("\\\\.\\D:"),GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (hDevice == INVALID_HANDLE_VALUE)
{
DebugOutput(GetLastError());
return FALSE;
}
HANDLE hFileMapping = CreateFileMapping(hDevice,NULL,PAGE_READWRITE,0,0,NULL);
DebugOutput(GetLastError()); //一到这句就报错,说参数不正确。
LPBYTE pFileView = (LPBYTE)MapViewOfFile(hFileMapping,FILE_MAP_WRITE,0,0,0);
......

请熟悉大文件处理的各位指点迷津,我哪里出了问题?? 很重要,一定要解决。。
...全文
203 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
jianpanlanyue 2012-11-25
  • 打赏
  • 举报
回复
按照楼上oyljerry的作法,创建INVALID_HANDLE_VALUE的映射的话,就变成读取虚拟盘的数据了,没办法映射到要被扫描的D盘啊?
傻X 2012-11-24
  • 打赏
  • 举报
回复
在另一贴已经回复楼主
oyljerry 2012-11-24
  • 打赏
  • 举报
回复
hFile Long,指定欲在其中创建映射的一个文件句柄0xFFFFFFFF(-1,即INVALID_HANDLE_VALUE)表示在页面文件中创建一个可共享的文件映射。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧