String和Pchar间的转换(50分)

  • 主题发起人 killfree
  • 开始时间
K

killfree

Unregistered / Unconfirmed
GUEST, unregistred user!
关于将String类型转换为Pchar类型,书上是这样说的:
只要把一个字符类型强制转换为Pchar类型。下面的代码演示了怎样调用Win32
的GetWindowsDirectory()函数,这个函数需要一个Pchar类型的参数:
var
S:String;
begin
SetLength(s,256);
//重要!首先给字符串分配空间
//调用API函数,S现在包含目录字符串
GetWindowsDirextory(Pchar(s),256);
可是我这样做了,为什么还报错啊?另外如何将Pchar转换为String啊?
谢谢!
 
var
s :pchar;
str: string;
GetMem(s,255);
GetWindowsDirextory(s,256);
freeMem(s);
string := s;
//ok
 
string(pchar)
 
procedure TForm1.Button1Click(Sender: TObject);
var
S:String;
begin
SetLength(s,256);
//重要!首先给字符串分配空间
//调用API函数,S现在包含目录字符串
GetWindowsDirectory(Pchar(s),256);
label1.Caption:=s;
end;

我试过了,没问题啊,
不过 GetWindowsDirextory => GetWindowsDirectory
[:D]
 
PChar(String)就可以了,没有那么复杂,
当然也可以这样定义
var
a : array[0..100] or char;
取@a就可以了
 
P a s c a l类型有下列几种不同的字符串类型来满足程序的要求:
•
AnsiString 这是P a s c a l缺省的字符串类型,它由AnsiChar 字符组成,其长度没有限制,同时与
n u l l结束的字符串相兼容。
•
ShortString 保留该类型是为了向后兼容Delphi 1.0,它的长度限制在2 5 5个字符内。
•
WideString 功能上类似于A n s i S t r i n g,但它是由Wi d e C h a r字符组成的。
•
PChar 指向n u l l结束的C h a r字符串的指针,类似于C的char * 或l p s t r类型。
•
PAnsiChar 指向n u l l结束的A n s i C h a r字符串的指针。
•
PWideChar 指向n u l l结束的Wi d e C h a r字符串的指针。
缺省情况下,如果用如下的代码来定义字符串,编译器认为是AnsiString 字符串:
v a r
S:string;
//编译器认为S的类型是A n s i S t r i n g
v a r
S : S t r i n g ;
b e g i n
SetLength(S,256);
//重要!首先给字符串分配空间
/ /调用A P I函数,S 现在包含目录字符串
G e t Wi n d o w s D i r e c t o r y ( P C h a r ( S ) , 2 5 6 ) ;
如果使用了将A n s i S t r i n g字符串强制转换为P C h a r类型的函数和过程,在使用结束后,要手工把它
的长度恢复为原来以n u l l结束的长度。S T R U T I L S单元中的R e a l i z e L e n g h t ( )函数可以实现这一点:
procedure RealizeLength(var S:string);
b e g i n
S e t L e n g t h ( S , S t r L e n ( P C h a r ( S ) ) ) ;
e n d ;
调用R e a l l i z e L e n g t h ( ) :
v a r
S : s t r i n g ;
b e g i n
SetLength(S,256);
//重要!首先给字符串分配空间
/ /调用函数,S现在包含目录字符串
G e t Wi n d o w D i r e c t o r y ( P C h a r ( S ) , 2 5 6 ) ;
RealizeLength(S);
//设置S的长度为n u l l结束的长度
e n d ;
注意在练习将一个字符串转换为P C h a r类型时要小心,因为字符串在超出其作用范围时有自
动回收的功能,因此当进行P:=PChar(Str)的赋值时,P的作用域(生存期)应当大于Str的作用域。
 
我知道我为什么错了:)
之前我是这样做的:
var
s:string;
temp:pchar;
……
temp:=trim(pchar(s));//写成temp:=pchar(trim(s))就没问题了。
他们之间的转换好象就用Pchar(),string(),强制转换就行了。
 
多人接受答案了。
 
顶部