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

jmf2000 2004-12-02 08:49:38
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,我怎么觉得已经超出它的访问范围了呢?这个时候后面的这个紧跟着的内存段如果在使用怎么办?
...全文
230 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
fayeflash 2004-12-03
  • 打赏
  • 举报
回复
jmf2000 2004-12-03
  • 打赏
  • 举报
回复
主要是想做个例子,就拿读取文件做例子了,我现在主要是在指针的转换上糊涂了,还有就是移位的时候有些觉得不对劲。
beyondtkl 2004-12-03
  • 打赏
  • 举报
回复
PData := MapViewOfFile(FMapHandle, FILE_MAP_ALL_ACCESS, 0, 0, FFileSize); //直接接收得了
// 这个不是接收...

你要做什么 就是想通过内存映射读写文件么。。
fayeflash 2004-12-03
  • 打赏
  • 举报
回复
是不是用什么类型的指针类型接收MapViewOfFile返回来的指针都行,指针本身就是记载了一个内存地址,一直到最后访问数据的时候才检查数据的类型。
leilu 2004-12-03
  • 打赏
  • 举报
回复
哈哈
jmf2000 2004-12-03
  • 打赏
  • 举报
回复
自己顶!
jmf2000 2004-12-03
  • 打赏
  • 举报
回复
我也知道不加没有问题,但是例子为什么要加呢?它说是要把PData转换成null结尾的字符串。
我关键想知道
PData := PChar(FData); //怎么理解这句话?能把指向Byte的指针转换成指向Char的指针?转换的过程和原理是什么?是不是PData把FData的偏移量取回来了就完事情了,也不检查指向的类型正确不正确?
fayeflash 2004-12-03
  • 打赏
  • 举报
回复
顶顶顶!!!!!!!
fayeflash 2004-12-03
  • 打赏
  • 举报
回复
再顶
g961681 2004-12-02
  • 打赏
  • 举报
回复
// PData := PChar(FData); //怎么理解这句话?能把指向Byte的指针转换成指向Char的指针?转换的过程和原理是什么?是不是PData把FData的偏移量取回来了就完事情了,也不检查指向的类型正确不正确?
// inc(PData, FFileSize); //下面这两句话一定要加吗?
// PData^ := #0;
这3句话,不加都没问题!
g961681 2004-12-02
  • 打赏
  • 举报
回复
那就顶一下吧!

5,939

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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