使用API的一个注意之处

时间:2010-02-27 18:00:01  来源:第二电脑网  作者:第二电脑网

  第二电脑网导读:>var  TempDir: array[0..255] of Char;begin  GetTempPath(255, @TempDir);  Result := StrPas(TempDir);end;很明显,如果临时目录的名称超过256,那么就会发生缓冲区溢出,得到的数据也不完全,实际上,临时目录全路径很可能超过256,Windows的长文件名是指这个目录或者文件的名字的限制,不是Full path/name的限制...
  正文:我们知道,很多情况下,Windows API函数都需要一个缓冲区,例如以获取临时目录的API GetTempPath为例,这个函数需要一个Buffer用来存放返回的目录名称,而很多人代码(包括许多高手和Borland的专家)是这样写的:
function GetTempDirectory: String;
var
  TempDir: array[0..255] of Char;
begin
  GetTempPath(255, @TempDir);
  Result := StrPas(TempDir);
end;
很明显,如果临时目录的名称超过256,那么就会发生缓冲区溢出,得到的数据也不完全,实际上,临时目录全路径很可能超过256,Windows的长文件名是指这个目录或者文件的名字的限制,不是Full path/name的限制!那么象这种函数该怎么来使用呢?
一般地,需要缓冲区的函数,我们需要调用两次!第一次调用是为了获得缓冲区的长度,然后第二次才是真正的调用,以上面的为例,真正正确的写法应该是:
function GetTempDirectory:string;
var
  Len:integer;
begin
  Len := GetTempPath(0,nil);
  SetLength(Result,Len + 1);
  GetTempPath(Len,@Result[1]);
end;
其他类似的函数如GetComputerName等等,都应该如此使用。

使用API的一个注意之处》由第二电脑网原创提供,转载请注明:http://www.002pc.com/master/College/Language/Delphi/12942.html


关键字:

关于《使用API的一个注意之处》文章的评论

站内搜索: 高级搜索

热门搜索: Windows style 系统 tr IP QQ CPU 安装 function 注册 if td