最近作的东西需要获取系统设备的描述名称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能够区分两个机子,但是却不能避免这种情况,安全性有待商榷。
浙公网安备 33010602011771号