注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

珠海渔郎之电子网档

项目管理 + 程序开发 + Delphi + 电脑应用 + 数码 + 进化感悟

 
 
 

日志

 
 

[存档2006-11-2]使用API的时候定义缓冲区的问题  

2009-07-04 21:35:13|  分类: Delphi |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
使用API的时候定义缓冲区的问题

我们知道,很多情况下,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等等,都应该如此使用。
另外忽然想起关于获取TRichedit/TMemo的脱字符光标位置,很多人都是使用SendMessage() + EM_LINEFROMCHAR消息来做的,实际上,这两个控件本身都有一个属性CaretPos,里面就保存了光标的位置(Delphi 5.0及其以上),唉,一误至斯!

  评论这张
 
阅读(139)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017