我正在维护使用SetupDiGetDeviceInterfaceDetail()查找有关计算机上安装的串行端口的信息的应用程序。我在测试时注意到有一些设备,比如我的Lucent WinModem,没有在枚举中显示。事实证明,我与我的公司制造的一组实现串行端口接口的设备有类似的问题。我的假设是,该设备的INF文件中缺少某些内容。有谁知道哪种情况会导致这种遗漏?为什么有些设备不能用SetupDiGetDeviceInterfaceDetail()枚举?
编辑:这里是我用来枚举串行端口的代码示例。我尝试过各种标志组合,但在行为方面没有发现任何显着差异。
DEFINE_GUID(GUID_CLASS_COMPORT, 0x4d36e978, 0xe325, 0x11ce, 0xbf, 0xc1, \
0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18);
GUID *serial_port_guid = const_cast<GUID *>(&GUID_CLASS_COMPORT);
HDEVINFO device_info = INVALID_HANDLE_VALUE;
SP_DEVICE_INTERFACE_DETAIL_DATA *detail_data = 0;
device_info = SetupDiGetClassDevs(
serial_port_guid, 0, 0, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if(device_info != INVALID_HANDLE_VALUE)
{
uint4 const detail_data_size = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA) + 256;
detail_data = reinterpret_cast<SP_DEVICE_INTERFACE_DETAIL_DATA *>(new char[detail_data_size]);
SP_DEVICE_INTERFACE_DATA ifc_data;
bool more_interfaces = true;
int rcd;
memset(&ifc_data, 0, sizeof(ifc_data));
memset(detail_data, 0, detail_data_size);
ifc_data.cbSize = sizeof(ifc_data);
detail_data->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
for(uint4 index = 0; more_interfaces; ++index)
{
rcd = SetupDiEnumDeviceInterfaces(device_info, 0, serial_port_guid, index, &ifc_data);
if(rcd)
{
// we need to get the details of this device
SP_DEVINFO_DATA device_data = { sizeof(SP_DEVINFO_DATA) };
rcd = SetupDiGetDeviceInterfaceDetail(
device_info, &ifc_data, detail_data, detail_data_size, 0, &device_data);
if(rcd)
{
StrAsc device_path(detail_data->DevicePath);
byte friendly_name[256];
rcd = SetupDiGetDeviceRegistryProperty(
device_info, &device_data, SPDRP_FRIENDLYNAME, 0, friendly_name, sizeof(friendly_name), 0);
if(rcd)
{
std::for_each(
port_names.begin(),
port_names.end(),
update_friendly_name(
reinterpret_cast<char const *>(friendly_name)));
}
}
else
more_interfaces = false;
}
}
}
这是一个很好的领导,但不幸没有描述我遇到的行为。在我的情况下,potr可以被访问。我在枚举中根本看不到它。 – 2009-02-23 12:29:51
我看到了与GUID相同的参考,并将其更新为与当前用于识别串行端口的参考相匹配。由于我自己声明了GUID对象,因此我只保留相同的名称。 – 2009-02-25 14:54:01
好的,增加了另一个有趣的网站 – lakshmanaraj 2009-02-26 04:18:51