5,388
社区成员
发帖
与我相关
我的任务
分享
function TMainFrm.RepairStr(sFileName:String;FindStr:string;RepairStr:String;RepairStrLen:integer):Boolean;
var
TmpMemoryStream : TMemoryStream;
CmpStr : array of Char;
CmpStr1 : array of Char;
FileSize,iAddress : Integer;
bWrite : Boolean;
s : String;
I : Integer;
begin
bWrite := False;
Result := False;
try
TmpMemoryStream := TMemoryStream.Create;
try
TmpMemoryStream.Clear;
TmpMemoryStream.LoadFromFile(sFileName);
FileSize := TmpMemoryStream.Size;
TmpMemoryStream.Position:=TmpMemoryStream.Size;
TmpMemoryStream.Position:=0;
SetLength(CmpStr,RepairStrLen);
SetLength(CmpStr1,RepairStrLen);
SetLength(s,FileSize);
CopyMemory(@s[1],TmpMemoryStream.Memory,TmpMemoryStream.size);
iAddress := Pos(FindStr,s) - 1;
TmpMemoryStream.Seek(iAddress,0);
TmpMemoryStream.ReadBuffer(CmpStr, SizeOf(CmpStr));
TmpMemoryStream.Seek(iAddress,0);
TmpMemoryStream.ReadBuffer(CmpStr1, SizeOf(CmpStr1));
TmpMemoryStream.Seek(iAddress,0);
For I := 0 to RepairStrLen do
begin
if CmpStr[I] <> RepairStr[I+1] then
CmpStr[I] := RepairStr[I+1];
end;
if string(CmpStr) <> string(CmpStr1) then
begin
TmpMemoryStream.WriteBuffer(CmpStr, SizeOf(CmpStr));
bWrite := True;
end;
Finally
Result := True;
if bWrite = True then
TmpMemoryStream.SaveToFile(sFileName);
TmpMemoryStream.Free;
end;
except
TmpMemoryStream.Free;
Result := False;
exit;
end;
end;
var
axt: array of byte;
P: PInteger;
begin
SetLength(axt, 20);
P := PInteger(axt);
dec(P);
si := P^;
ShowMessage(IntToStr(P^));
end;
procedure _DynArrayLength;
asm
TEST EAX,EAX
JZ @@skip
MOV EAX,[EAX-4] //数组头地址-4的地址中的内容(即动态数组长度)取出
@@skip:
end;
procedure Move( const Source; var Dest; count : Integer );
{$IFDEF PUREPASCAL}
var
S, D: PChar;
I: Integer;
begin
S := PChar(@Source);
D := PChar(@Dest);
if S = D then Exit;
if Cardinal(D) > Cardinal(S) then
for I := count-1 downto 0 do
D[I] := S[I]
else
for I := 0 to count-1 do
D[I] := S[I];
end;
function TMainFrm.RepairStr(sFileName:String;FindStr:string;RepairStr:String;RepairStrLen:integer):Boolean;
var
TmpMemoryStream : TMemoryStream;
CmpStr : array of Char;
CmpStr1 : array of Char;
FileSize,iAddress,SizeOf1 : Integer;
bWrite : Boolean;
s : String;
I : Integer;
begin
bWrite := False;
Result := False;
SetLength(CmpStr,RepairStrLen);
SetLength(CmpStr1,RepairStrLen);
try
TmpMemoryStream := TMemoryStream.Create;
try
TmpMemoryStream.Clear;
TmpMemoryStream.LoadFromFile(sFileName);
FileSize := TmpMemoryStream.Size;
TmpMemoryStream.Position:=TmpMemoryStream.Size;
TmpMemoryStream.Position:=0;
SetLength(s,FileSize);
CopyMemory(@s[1],TmpMemoryStream.Memory,TmpMemoryStream.size);
iAddress := Pos(FindStr,s) - 1;
if iAddress >= 0 then
begin
TmpMemoryStream.Seek(iAddress,0);
TmpMemoryStream.ReadBuffer(CmpStr[0],Length(CmpStr));
TmpMemoryStream.Seek(iAddress,0);
TmpMemoryStream.ReadBuffer(CmpStr1[0],Length(CmpStr1));
TmpMemoryStream.Seek(iAddress,0);
For I := 0 to RepairStrLen - 1 do
begin
if CmpStr[I] <> RepairStr[I + 1] then
CmpStr[I] := RepairStr[I + 1];
end;
if string(CmpStr) <> string(CmpStr1) then
begin
TmpMemoryStream.WriteBuffer(CmpStr[0], Length(CmpStr));
bWrite := True;
end;
end;
Finally
Result := True;
if bWrite = True then
TmpMemoryStream.SaveToFile(sFileName);
TmpMemoryStream.Free;
end;
except
Result := False;
exit;
end;
end;