//以 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;