同样的代码为何在delphi7编译运行正常~而在Xe2会出错呢?该如何解决
同样的代码为何在delphi7编译运行正常~而在Xe2会出错呢?
代码如下:
代码如下:
unit UnitUtil;
interface
uses
System.SysUtils, System.Classes, Winapi.Windows;
function HexToString(S:string):string;
function HexScan(t:tstream; s:string):integer;
function HexRead(t:tstream; s:DWORD; b:Byte):Integer;
function ReadAddress(FlagCode:string;MyFile:TFileStream;Offset:Integer):string;
function ReadOffsetAdress(FlagCode:string;MyFile:TFileStream;Offset:Integer;const nSize:Integer=4):string;
function ReadCallAddress(FlagCode:string;MyFile:TFileStream;Offset,Modify:Integer):string;
implementation
function HexToString(S: string): string;//转十六进制字符串
var
i: integer;
tmpstr:string;
Begin
Result := '';
for i := 1 to Length(S) do
begin
if ((i mod 2)=1) then
begin
tmpstr:=Copy(S, i, 2);
if tmpstr='**' then
Result:=Result+'*'
else
Result:=Result + Chr(StrToInt('0x' + Copy(S, i, 2)));
end;
end;
end;
function HexScan(t:tstream; s:string):integer; //找地址所在位置
var
i, j: integer;
p: pchar;
begin
Result:=-1;
getmem(p, t.size); // ---- 分配内存
t.readbuffer(p^, t.size ); // ---- 读
for i:=0 to t.size -1 do
begin
for j:=1 to length(s) do
begin
if s[j]='*' then //匹配通配符'*',强制下一轮循环
Continue;
if p[i+j]<>s[j] then // ---- 有一个不同即退出
begin
break;
end;
end;
if j>length(s) then // ---- 依据
begin
Result:=i+1;
break;
end;
end;
freemem(p);
t.seek(0, soBeginning); // ---- 返回文件头
end;
function HexRead(t:tstream; s:DWORD; b:Byte):Integer;//读地址所在位置
var
d: DWORD;
begin
t.seek(s, soBeginning); // ---- 到Length位置;
t.Read(d, b); // ---- 读b字节
Result:=d;
t.seek(0, soBeginning); // ---- 返回文件头
end;
function ReadAddress(FlagCode:string;MyFile:TFileStream;Offset:Integer):string;
var
Addr:Integer;
begin
Addr := HexScan(MyFile, HexToString(FlagCode));
if Addr = -1 then
Result := 'Null'
else
Result :='$' + IntToHex($400000 + Addr + Offset, 1);
end;
function ReadOffsetAdress(FlagCode:string;MyFile:TFileStream;Offset:Integer;const nSize:Integer=4):string;
var
Addr:Integer;
begin
Addr:=HexScan(MyFile,HexToString(FlagCode));
if Addr=-1 then
Result:='Null'
else
Result:='$'+ IntToHex(HexRead(MyFile, Addr + Offset, nSize),1)
end;
function ReadCallAddress(FlagCode:string;MyFile:TFileStream;Offset,Modify:Integer):string;
var
Addr:Integer;
begin
Addr:=HexScan(MyFile,HexToString(FlagCode));
if Addr=-1 then
Result:='Null'
else
Result := '$' + IntToHex(($400000 + Addr) + HexRead(MyFile, Addr+Offset, 4) + Modify, 1)
end;
end.
unit UnitMain;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls, UnitUtil;
type
TMainForm = class(TForm)
edt_Path: TEdit;