hr = pServices->CreateInstanceEnum(bstrClass, WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &ppEnum); if (hr != WBEM_S_NO_ERROR) { m_dwRet = ERROR_GET_USB_PORT_INFORMATION; sprintf(fbuf, "Log\\%08X", m_dwRet); sprintf(sExpect, "Get USB port num"); sprintf(sRead, "Fail to Get USB port num"); CreateFailLog(fbuf, sExpect, sRead); return m_dwRet; }
SysFreeString(bstrClass); hr = ppEnum->Next(WBEM_INFINITE, 12, pUSBHub, &uReturned); ppEnum->Release(); if (FAILED(hr) || (uReturned == 0)) { m_dwRet = ERROR_GET_USB_PORT_INFORMATION; sprintf(fbuf, "Log\\%08X", m_dwRet); sprintf(sExpect, "Get USB port num"); sprintf(sRead, "Fail to Get USB port num"); CreateFailLog(fbuf, sExpect, sRead); return m_dwRet; } nPortNum = uReturned; }
1 搜索 HUB GUID ,透过 Setup***
2 判断 hispeed or fullspeed
3 deviocontrol 获得 hub port 数量
4 相加得到PORT总数5 如果只查 root hub,靠Name 或者 devinst parent 关系确定。慢慢长路 ...
{
nPortNum = 0;
DWORD m_dwRet = ERROR_SUCCESS;
char szUSBDeviceID[255];
memset(szUSBDeviceID, 0, sizeof(szUSBDeviceID)); DWORD uReturned = 0;
IEnumWbemClassObject *ppEnum = NULL;
IWbemClassObject *pUSBHub[12]; char *chPropertyValue = NULL;
const BSTR bstrClass = SysAllocString(L"Win32_USBHub");
hr = pServices->CreateInstanceEnum(bstrClass,
WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&ppEnum);
if (hr != WBEM_S_NO_ERROR)
{
m_dwRet = ERROR_GET_USB_PORT_INFORMATION;
sprintf(fbuf, "Log\\%08X", m_dwRet);
sprintf(sExpect, "Get USB port num");
sprintf(sRead, "Fail to Get USB port num");
CreateFailLog(fbuf, sExpect, sRead);
return m_dwRet;
}
SysFreeString(bstrClass);
hr = ppEnum->Next(WBEM_INFINITE, 12, pUSBHub, &uReturned);
ppEnum->Release();
if (FAILED(hr) || (uReturned == 0))
{
m_dwRet = ERROR_GET_USB_PORT_INFORMATION;
sprintf(fbuf, "Log\\%08X", m_dwRet);
sprintf(sExpect, "Get USB port num");
sprintf(sRead, "Fail to Get USB port num");
CreateFailLog(fbuf, sExpect, sRead);
return m_dwRet;
} nPortNum = uReturned;
}