Henrylgz的Blog

学习,生活,思考,一切都在继续。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

遭遇系统API的BUG。。。

Posted on 2006-03-13 22:12  追求卓越  阅读(1363)  评论(0)    收藏  举报

    最近作的东西需要获取系统设备的描述名称SPDRP_DEVICEDESC,用到了这个系统的API:SetupDiGetDeviceRegistryProperty,MSDN中如下声明:
BOOL SetupDiGetDeviceRegistryProperty(
  HDEVINFO DeviceInfoSet,
  PSP_DEVINFO_DATA DeviceInfoData,
  DWORD Property,
  PDWORD PropertyRegDataType,
  PBYTE PropertyBuffer,
  DWORD PropertyBufferSize,
  PDWORD RequiredSize
);
在使用上,参照了一个例子:
  while (!SetupDiGetDeviceRegistryProperty(
   hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC, &DataT, (unsigned char *)buffer, buffersize, &buffersize))
  {
   if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
   {
    // Change the buffer size.
    memset(buffer, 0, 512);
   }
   else
   {
    // Insert error handling here.
    break;
   }
  } 
这样一次可以获得一个设备的描述名称。
测试的时候,英文XP,中文XP都没有问题,中文2K系统出现了问题,在这里出错了,无法获取。
跟进去仔细看,发现在获得“打印机端口”这个设备的时候,buffersize返回值为6,明显示不正确的,于是就重置了缓冲区。
为了验证这个问题,在中文XP下,同样的debug中,在获得“打印机端口”这个设备的时候,buffersize返回值为11,5个中文1个结束符,完全正确,于是获取成功。
我看了一下这个函数用到的Setupapi.dll的版本号,XP下是5.1.2600.2180(XP+sp2),在2K下是5.0.2195.6622(2K+sp4)
显然问题得到了修正。
这就是遭遇系统API的BUG的经历,经常看到说系统升级有什么必要,我想,这就是必要吧。
另外要顺便表扬和批评两个软件:
要表扬的软件:VMWare
理由:半天就给我提供了4个虚拟机的环境,不用重新启动就可以快速的切换各种系统以便测试。真是太方便了。
要批评的软件:VSS6.0
理由:我在两个虚拟机里面用相同的用户名和相同的工作路径check out服务器上的文件,竟然可以互相check in文件,仅仅有一个提示而已。VSS能够区分两个机子,但是却不能避免这种情况,安全性有待商榷。