TFileStream.WriteBuffer XE4 VS XE7

时间:2015-06-25 01:25:06

标签: delphi delphi-xe7 delphi-xe4

这段代码完全在Delphi XE4上运行:

var
b: byte;
fl: TFileStream;
filename:string;
begin
b:= $2F;
filename:='C:\test.exe';
fl:= tFileStream.Create(filename, 0,fmOpenReadWrite);
fl.Position:= $C;
fl.WriteBuffer(b,sizeof(b));
fl.free
end;

然而,当我在同一台PC上的Delphi XE7上运行完全相同的代码时,它会因错误而出现错误" Stream write error"。

1 个答案:

答案 0 :(得分:3)

TFileStream构造函数中,您将Mode参数设置为0(fmOpenRead),将Rights参数设置为fmOpenReadWrite。你需要交换它们:

//fl:= tFileStream.Create(filename, 0, fmOpenReadWrite);
fl:= tFileStream.Create(filename, fmOpenReadWrite, 0);

或者简单地说:

fl:= tFileStream.Create(filename, fmOpenReadWrite);

如果fmCreate参数中没有Mode标记,则TFileStream会调用FileOpen()而不是FileCreate()

在XE4中,当Mode在Windows上调用Rights时,ORTFileStream参数会FileOpen()一起编辑:

inherited Create(FileOpen(AFileName, Mode or Rights));
// which is: FileOpen(AFileName, fmOpenRead or fmOpenReadWrite)
// effectively: FileOpen(AFileName, fmOpenReadWrite)

这就是您的代码在XE4中运行的原因。您正在以读/写模式打开文件。

在XE7中,当Rights每个平台上调用TFileStream时,FileOpen()参数会被忽略:

inherited Create(FileOpen(AFileName, Mode));
// effectively: FileOpen(AFileName, fmOpenRead)

这就是为什么你的代码在XE7中不起作用的原因。您正在以只读模式打开文件。