16,747
社区成员




showmessage(inttostr(integer(pchar(str))));
str:='12314554';
showmessage(inttostr(integer(pchar(str))));
@str[1];
showmessage(inttostr(integer(pchar(str))));
procedure TForm1.Button1Click(Sender: TObject);
procedure WriteData(P: PChar);
var
i: Integer;
S: String;
begin
S := 'Test'#0;
for i := 1 to Length(S) do
begin
P^ := S[i];
Inc(P);
end;
end;
var
Str, S: string;
i: integer;
begin
Form1.Caption := 'Test';
SetLength(S, 10);
for i := 1 to Length(S) do
S[i] := Chr(Ord('0') + i - 1);
Str := S;//'0123456789'
WriteData(PChar(Str));//我们修改的是Str内容
ShowMessage(S);//S<>'0123456789'了,而为'Test'#0'56789',弹出的为'Test',#0以后的不显示
end;
procedure TForm1.Button1Click(Sender: TObject);
procedure WriteData(P: PChar);
var
i: Integer;
S: String;
begin
S := 'Test'#0;
for i := 1 to Length(S) do
begin
P^ := S[i];
Inc(P);
end;
end;
var
Str: string;
begin
Form1.Caption := 'Test';
Str := '1234567890';
//GetWindowText(Handle, PChar(Str), 10);
WriteData(PChar(Str));
ShowMessage(Str); //错误:弹出1234567890
end;
procedure _UniqueStringA(var str: AnsiString);
asm
JMP InternalUniqueString
end;
var
str: String;
begin
Form1.Caption := '测试';
str := '1234567890';
GetWindowText(Form1.Handle,PChar(str)(*PChar只取str的实际内存存储空间首地址*),10);
ShowMessage(format('错误号:%d,错误信息:%s',[GetLastError,SysErrorMessage(GetLastError)]));\
ShowMessage(str);
end;
var
str: String;
P,P1: PChar;
begin
Form1.Caption := '测试';
str := '1234567890';
P := PChar(str);//取得str原始地址
@str[1];
P1 := PChar(str);//取得str新地址
//查看两个地址进行比较
ShowMessage(Format('str原地址=$%x,str新地址=$%x',[LongWord(P),LongWord(p1)]));
GetWindowText(Form1.Handle,PChar(str)(*PChar只取str的实际内存存储空间首地址*),10);
ShowMessage(format('错误号:%d,错误信息:%s',[GetLastError,SysErrorMessage(GetLastError)]));
ShowMessage(str);
ShowMessage(format('原串:%s,新串:%s',[strpas(p),strpas(p1)]));
end;
var
Str:String;
begin
Form1.Caption:='Test';
Str:='1234567890';
GetWindowText(Handle,PChar(Str),10);
ShowMessage(Str);//错误:弹出1234567890
以上代码修改后:
var
Str:String;
begin
Form1.Caption:='Test';
Str:='1234567890';
@Str[1]; //此处只取地址,什么都不做
GetWindowText(Handle,PChar(Str),10);
ShowMessage(Str);//正确:弹出Test
end;