CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

关于内存映射文件的问题,顺带问个指针的问题。顶者有分。

楼主jmf2000(蜜蜂)2004-12-02 20:49:38 在 Delphi / VCL组件开发及应用 提问

var  
      FFileHandle:   THandle;   //   Handle   to   the   open   file.  
      FMapHandle:   THandle;     //   Handle   to   a   file-mapping   object  
      FFileSize:   Integer;       //   Variable   to   hold   the   file   size.  
      FData:   PByte;                   //   Pointer   to   the   file's   data   when   mapped.  
      PData:   PChar;                   //   Pointer   used   to   reference   the   file   data.  
  begin  
      FFileHandle   :=   FileOpen(文件名,   fmOpenReadWrite);  
      FFileSize   :=   GetFileSize(FFileHandle,   Nil);  
      FMapHandle   :=   CreateFileMapping(FFileHandle,   nil,PAGE_READWRITE,   0,   FFileSize,   nil);  
      CloseHandle(FFileHandle);  
      FData   :=   MapViewOfFile(FMapHandle,   FILE_MAP_ALL_ACCESS,   0,   0,   FFileSize);   //这个时候返回的是一个指针,我们怎么知道它的类型是什么?是不是随便用个指针类型的变量接收就行呢?象程序这样写,FData是指向Byte的指针,那么这个时候FData^的意思是什么?  
      PData   :=   PChar(FData);   //怎么理解这句话?能把指向Byte的指针转换成指向Char的指针?转换的过程和原理是什么?是不是PData把FData的偏移量取回来了就完事情了,也不检查指向的类型正确不正确?  
      inc(PData,   FFileSize);   //下面这两句话一定要加吗?  
      PData^   :=   #0;    
      StrUpper(PChar(FData));   //这个函数会把PChar(FData)在内存里的东西全部转换成大写?  
      UnmapViewOfFile(FData);  
  end;  
   
  我这么写是不是也行呢:  
  var  
      FFileHandle:   THandle;   //   Handle   to   the   open   file.  
      FMapHandle:   THandle;     //   Handle   to   a   file-mapping   object  
      FFileSize:   Integer;       //   Variable   to   hold   the   file   size.  
      FData:   PByte;                   //   Pointer   to   the   file's   data   when   mapped.  
      PData:   PChar;                   //   Pointer   used   to   reference   the   file   data.  
  begin  
      FFileHandle   :=   FileOpen(文件名,   fmOpenReadWrite);  
      FFileSize   :=   GetFileSize(FFileHandle,   Nil);  
      FMapHandle   :=   CreateFileMapping(FFileHandle,   nil,PAGE_READWRITE,   0,   FFileSize,   nil);  
      CloseHandle(FFileHandle);  
      PData   :=   MapViewOfFile(FMapHandle,   FILE_MAP_ALL_ACCESS,   0,   0,   FFileSize);   //直接接收得了  
      inc(PData,   FFileSize);    
      PData^   :=   #0;    
      Dec(PData,   FFileSize);//再移动回来  
      StrUpper(PData);   //直接转换  
      UnmapViewOfFile(PData);  
  end;  
  还有,假设FFileSize=1,这个时候inc(PData,   FFileSize)相当于把指针后移了1,我怎么觉得已经超出它的访问范围了呢?这个时候后面的这个紧跟着的内存段如果在使用怎么办? 问题点数:100、回复次数:11Top

1 楼g961681(技术庸人(情商太低))回复于 2004-12-02 21:29:47 得分 30

那就顶一下吧!Top

2 楼g961681(技术庸人(情商太低))回复于 2004-12-02 21:34:10 得分 0

//     PData   :=   PChar(FData);   //怎么理解这句话?能把指向Byte的指针转换成指向Char的指针?转换的过程和原理是什么?是不是PData把FData的偏移量取回来了就完事情了,也不检查指向的类型正确不正确?  
  //     inc(PData,   FFileSize);   //下面这两句话一定要加吗?  
  //     PData^   :=   #0;  
  这3句话,不加都没问题!Top

3 楼jmf2000(蜜蜂)回复于 2004-12-03 08:03:42 得分 0

我也知道不加没有问题,但是例子为什么要加呢?它说是要把PData转换成null结尾的字符串。  
  我关键想知道  
  PData   :=   PChar(FData);   //怎么理解这句话?能把指向Byte的指针转换成指向Char的指针?转换的过程和原理是什么?是不是PData把FData的偏移量取回来了就完事情了,也不检查指向的类型正确不正确?  
  Top

4 楼jmf2000(蜜蜂)回复于 2004-12-03 08:31:33 得分 0

自己顶!Top

5 楼leilu(Java)回复于 2004-12-03 08:35:26 得分 20

哈哈Top

6 楼fayeflash(我爱阿菲)回复于 2004-12-03 08:37:54 得分 0

是不是用什么类型的指针类型接收MapViewOfFile返回来的指针都行,指针本身就是记载了一个内存地址,一直到最后访问数据的时候才检查数据的类型。Top

7 楼beyondtkl(大龙驹<*好久没来了,兄弟们好吧。*>)回复于 2004-12-03 09:07:23 得分 30

PData   :=   MapViewOfFile(FMapHandle,   FILE_MAP_ALL_ACCESS,   0,   0,   FFileSize);   //直接接收得了  
  //   这个不是接收...  
   
  你要做什么   就是想通过内存映射读写文件么。。Top

8 楼jmf2000(蜜蜂)回复于 2004-12-03 10:51:53 得分 0

主要是想做个例子,就拿读取文件做例子了,我现在主要是在指针的转换上糊涂了,还有就是移位的时候有些觉得不对劲。Top

9 楼fayeflash(我爱阿菲)回复于 2004-12-03 12:59:22 得分 20

顶Top

10 楼fayeflash(我爱阿菲)回复于 2004-12-03 14:28:30 得分 0

再顶Top

11 楼fayeflash(我爱阿菲)回复于 2004-12-03 14:31:37 得分 0

顶顶顶!!!!!!!Top

相关问题

  • 内存映射文件
  • 内存映射文件的问题
  • 内存映射文件的问题
  • 关于内存映射文件
  • 关于“内存映射文件”讨论
  • 有关内存映射文件操作
  • 文件映射内存共享问题
  • 我用MapViewOfFile得到了内存映射文件的地址,但如何移动指针读取每个记录呢?谢谢?
  • 内存映射
  • 关于VC内存映射文件,菜鸟提问!

关键词

  • 指针
  • 转换
  • 内存
  • 文件
  • 检查
  • 原理
  • ffilesize
  • fdata
  • pdata
  • ffilehandle

得分解答快速导航

  • 帖主:jmf2000
  • g961681
  • leilu
  • beyondtkl
  • fayeflash

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo