在 API 函数中使用 PChar 参数的几种方法



//以 GetWindowsDirectory 为例:



{ 以静态数组做缓冲区 }

procedure TForm1.Button1Click(Sender: TObject);

var

  buf: array[0..MAX_PATH-1] of Char;

begin

  GetWindowsDirectory(buf, SizeOf(buf));

  ShowMessage(buf); { C:\\WINDOWS }

end;



{ 自己分配内存 }

procedure TForm1.Button2Click(Sender: TObject);

var

  p: PChar;

begin

  p := StrAlloc(MAX_PATH);

  GetWindowsDirectory(p, StrBufSize(p));

  ShowMessage(p); { C:\\WINDOWS }

  StrDispose(p);

end;



{ 直接使用 string; 这和下一种方法都需要再删除尾部空白 }

procedure TForm1.Button3Click(Sender: TObject);

var

  str: string;

  len: Integer;

begin

  SetLength(str, MAX_PATH);

  len := GetWindowsDirectory(PChar(str), ByteLength(str));

  SetLength(str, len);

  ShowMessage(str); { C:\\WINDOWS }

end;



{ 同时, 把 PChar(str) 改为 @str[1] }

procedure TForm1.Button4Click(Sender: TObject);

var

  str: string;

  len: Integer;

begin

  SetLength(str, MAX_PATH);

  len := GetWindowsDirectory(@str[1], ByteLength(str));

  SetLength(str, len);

  ShowMessage(str); { C:\\WINDOWS }

end;



{ 这种方法最好, 先获取结果的长度... }

procedure TForm1.Button5Click(Sender: TObject);

var

  len: Integer;

  str: string;

begin

  len := GetWindowsDirectory(nil, 0);

  SetLength(str, len);

  GetWindowsDirectory(PChar(str), len);

  ShowMessage(str); { C:\\WINDOWS }

end;


 
   

你可能感兴趣的:(char)