一个GetLastError 234的Bug

昨天QA给我报了一个bug,我写的一个模块在xp下面功能异常,而win7下面是正常的。我刚才还有些不相信,这怎么可能呢?

我自己在xp下面试一试,果然有问题。马上打开代码定位一下,居然是一处读注册表失败。我用SHGetValue从注册表里面读字符串,返回了错误码234。234的意思是有更多数据可用,问题出在我传给SHGetValue的缓冲区大小比实际要读取的缓冲区大小下。

稍微思考一下,我传入的大小是MAX_PATH,足够读取任何路径字符串了。然后再去注册表看下真实值,131字符长度,显然足够。看了下SHGetValue要求的字符长度是264,我突然意识到是不是由于Unicode造成的。然后再次读下msdn,SHGetValue最后一个参数的意思是数据缓冲区的大小,不是字符的个数,所以Unicode下面MAX_PATH去读路径可能是不够的。

然后改代码的时候review了一下其他部分,没准以前也存在这样的bug只是没有触发,果然有好几处。写代码也是步步惊心啊。

发表评论

电子邮件地址不会被公开。 必填项已用*标注