谁能帮我把String换成PChar ( 积分: 50 )

  • 主题发起人 主题发起人 catcatdogdog
  • 开始时间 开始时间
C

catcatdogdog

Unregistered / Unconfirmed
GUEST, unregistred user!
简单的函数
function ABC(const S: String): String;
var
i: Integer;
begin
Result := '';
for i := 1 to Length(S) do
Result := Result + IntToStr(Byte(S));
end;

现在要写到Dll里面,要改成PChar
function (const P: PChar): PChar;
自己改的老是出内存错误,应该怎样改才好?另外,const关键字在这里有没有必要?
 
简单的函数
function ABC(const S: String): String;
var
i: Integer;
begin
Result := '';
for i := 1 to Length(S) do
Result := Result + IntToStr(Byte(S));
end;

现在要写到Dll里面,要改成PChar
function (const P: PChar): PChar;
自己改的老是出内存错误,应该怎样改才好?另外,const关键字在这里有没有必要?
 
直接PChar(你的String)就转换了啊
 
你用Widestring代替String试试看 [:)]
 
是要把函数里面的参数和返回值改成PChar的
 
function ABC(const S: PChar): PChar;
var
i: Integer;
S1: String;
S2: String;
begin
S2 := '';
S1 := S;
for i := 1 to Length(S1) do
S2 := S2 + IntToStr(Byte(S1));
Result := PChar(S2);
end;
可以吗
 
上面在输入字符串较短的时候可以
长了就被截断了
难道说PChar有255字节的限制吗?
 
PChar没有255字节的限制
ShortString有255字节的限制
 
function ABC(const S: String): String;
var
i: Integer;
begin
Result := '';
for i := 1 to Length(S) do
Result := Result + IntToStr(Byte(S));
end;

function ABC2(const S: PChar): PChar;
var
i: Integer;
S1: String;
S2: String;
begin
S2 := '';
S1 := S;
for i := 1 to Length(S1) do
S2 := S2 + IntToStr(Byte(S1));
Result := PChar(S2);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
richedit2.Text := ABC(richedit1.Text);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
richedit2.Text := ABC2(PChar(richedit1.Text));
end;

当ricedit1里面的文字比较少时,ABC和ABC2得到的结果一样
当文字比较多时(50行),ABC2得到的结果就变成ABC得到结果的一部分了
为什么哩
 
ft,Delphi帮助上说:

function title(n: Integer): PChar;
var
s: string;
begin
s := Format('title - %d', [n]);
Result := PChar(s)
// DON'T DO THIS
end;

This example returns a pointer to string data that is freed when the title function returns.
 
function ABC(s: pChar): pChar;
var
i: Integer;
str : String;
begin
str := '';
for i := 0 to StrLen(s)-1 do
begin
str := str + IntToStr(ORD(s));
end;
Result := pChar(str);
end;
 
改成下面这样好像就可以了:
function ABC3(const S: PChar): PChar;
var
i: Integer;
S1: String;
S2: String;
begin
S2 := '';
S1 := S;
for i := 1 to Length(S1) do
S2 := S2 + IntToStr(Byte(S1));
GetMem(Result, Length(S2));
StrCopy(Result, PChar(S2));
end;
 
改成下面这样好像就可以了:
function ABC3(const S: PChar): PChar;
var
i: Integer;
S1: String;
S2: String;
begin
S2 := '';
S1 := S;
for i := 1 to Length(S1) do
S2 := S2 + IntToStr(Byte(S1));
GetMem(Result, Length(S2));
StrCopy(Result, PChar(S2));
end;
 
多人接受答案了。
 

Similar threads

后退
顶部