关于内存映射文件的问题,顺带问个指针的问题。顶者有分。
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,我怎么觉得已经超出它的访问范围了呢?这个时候后面的这个紧跟着的内存段如果在使用怎么办?