delphi中使用API时的一点注意之处
2006-11-24 17:29
246 查看
我们知道,很多情况下,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 pathname的限制!那么象这种函数该怎么来使用呢?
一般地,需要缓冲区的函数,我们需要调用两次!第一次调用是为了获得缓冲区的长度,然后第二次才是真正的调用,以上面的为例,真正正确的写法应该是:
procedure TForm1.Button1Click(Sender: TObject);
var
mybuf:array of char;
len:integer;
begin
len:=GetTempPath(0,nil);
setlength(mybuf,len);
GetTempPath(len+1,pchar(mybuf));
showmessage(pchar(mybuf));
end;
其他类似的函数如GetComputerName等等,都应该如此使用。 另此处也注意Pchar的使用方法!
function GetTempDirectory: String;
var
TempDir: array[0..255] of Char;
begin
GetTempPath(255, @TempDir);
Result := StrPas(TempDir);
end;
很明显,如果临时目录的名称超过256,那么就会发生缓冲区溢出,得到的数据也不完全,实际上,临时目录全路径很可能超过256,Windows的长文件名是指这个目录或者文件的名字的限制,不是Full pathname的限制!那么象这种函数该怎么来使用呢?
一般地,需要缓冲区的函数,我们需要调用两次!第一次调用是为了获得缓冲区的长度,然后第二次才是真正的调用,以上面的为例,真正正确的写法应该是:
procedure TForm1.Button1Click(Sender: TObject);
var
mybuf:array of char;
len:integer;
begin
len:=GetTempPath(0,nil);
setlength(mybuf,len);
GetTempPath(len+1,pchar(mybuf));
showmessage(pchar(mybuf));
end;
其他类似的函数如GetComputerName等等,都应该如此使用。 另此处也注意Pchar的使用方法!
相关文章推荐
- delphi中使用API时的一点注意之处
- Python3关与迭代器next()使用为__next__()的一点注意事项
- Delphi使用主从表时注意事项
- (转)SqlHelper 使用中需要注意的一点(带输出、返回参数的存储过程)
- Delphi中使用资源文件的一点记录
- 使用COleDataSource.DoDropDrag进行往外Drag时要注意的一点
- Delphi使用TADOQuery时参数使用的注意点
- python使用百度语音识别API注意事项
- 在Linux中使用STL迭代器的一点注意事项
- spring-data-redis 使用过程中需要注意的一点
- delphi的tclientdataset的中文过滤使用注意事项
- 音乐播放器,注意静态常量的使用命名要有明确具体的含义(查看API,若想获得音乐本身自带的歌手名以及图片等信息,可查看MediaMetadataRetrieve来获得详细信息)
- 关于宏##的使用注意一点
- 使用 .net 2.0 中 linkLabel 控件要注意的一点
- 使用ES5 reduce()方法的一点小注意事项
- 求两数的最公约数的三种方法及gets()函数的使用的一点注意的地方
- 使用mysql函数 group_concat 一点需要注意的
- 关于宏##的使用注意一点
- Unity LLAPI 底层Native插件在x86 (32bit) 下编译的一点注意
- NSNotificationCenter使用block方式的一点注意事项