我正在研究一个小字节修补程序,但遇到错误。
修改之前复制文件失败,没有错误,(没有看到复制的输出),但是文件已成功打补丁。
这是补丁代码
procedure DoMyPatch();
var
i: integer;
FileName: string;
input: TFileStream;
FileByteArray, ExtractedByteArray: array of Byte;
begin
FileName := 'Cute1.res';
try
input := TFileStream.Create(FileName, fmOpenReadWrite);
except
begin
ShowMessage('Error Opening file');
Exit;
end
end;
input.Position := 0;
SetLength(FileByteArray, input.size);
input.Read(FileByteArray[0], Length(FileByteArray));
for i := 0 to Length(FileByteArray) do
begin
SetLength(ExtractedByteArray, Length(OriginalByte));
ExtractedByteArray := Copy(FileByteArray, i, Length(OriginalByte));
// function that compares my array of bytes
if CompareByteArrays(ExtractedByteArray, OriginalByte) = True then
begin
// Begin Patching
CopyFile(PChar(FileName), PChar(ChangeFileExt(FileName, '.BAK')),
true); =======>>> fails at this point, no copied output is seen.
input.Seek(i, SoFromBeginning);
input.Write(BytetoWrite[0], Length(BytetoWrite)); =====>>> patches successfully
input.Free;
ShowMessage('Patch Success');
Exit;
end;
end;
if Assigned(input) then
begin
input.Free;
end;
ShowMessage('Patch Failed');
end;
sidenote:如果我在尝试复制之前关闭文件流,它将复制良好。
顺便说一下,我已经在Delphi 7和XE7上对其进行了测试。谢谢
您无法复制文件,因为在为文件流打开文件时已将其独占锁定,这就是CopyFile
失败的原因。
您应在尝试调用之前关闭文件CopyFile
。这将需要您重新打开文件以对其进行修补。或者,可以使用其他共享模式打开文件。
其他一些评论:
try/finally
。0
对Length(arr)-1
以下。或使用low()
和high()
。CopyFile
。呼叫来包装它Win32Check
。Copy
函数返回一个新数组。因此,您对进行了虚假呼叫SetLength
。要复制整个数组,请使用的一个参数重载Copy
。代码中还有很多其他奇怪的地方,我用尽了所有精力将它们全部指出。我想我有主要的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句