这段代码完全在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"。
答案 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
时,OR
和TFileStream
参数会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中不起作用的原因。您正在以只读模式打开文件。