请教USB编程(急!!!)
请问以下程序为什么不能查找到可用的USB设备信息?
开发环境:VC6,win2000sp2,win2000 DDK
程序:查找可用的USB设备信息
extern "C" {
#include <setupapi.h>
#include <hidsdi.h>
}
//注:已添加setupapi.lib,hid.lib文件到工程里
//以下为程序源码,放在一个按钮的Click事件里
CString m_strPath;
CString m_strLog;
// BOOL m_bFoundDevice;
m_strLog.Empty();
m_strLog = _T("正在查找系统中HID类的GUID标识...");
m_lstInfo.AddString(m_strLog);//m_lstInfo是ListBox控件
// 查找本系统中HID类的GUID标识
GUID guidHID;
HidD_GetHidGuid(&guidHID);
m_strLog = _T("HID类的GUID标识为:");
m_lstInfo.AddString(m_strLog);
m_strLog.Format("%08x-%04x-%04x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x\r\n",
guidHID.Data1,guidHID.Data2,guidHID.Data3,guidHID.Data4[0],
guidHID.Data4[1],guidHID.Data4[2],guidHID.Data4[3],guidHID.Data4[4],
guidHID.Data4[5],guidHID.Data4[6],guidHID.Data4[7]);
m_strLog.MakeUpper();
m_lstInfo.AddString(m_strLog);
HDEVINFO hDevInfo =SetupDiGetClassDevs(&guidHID,NULL,0,
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if (hDevInfo == INVALID_HANDLE_VALUE)
{
m_lstInfo.AddString("抱歉,未找到可用设备");
return;
}
m_lstInfo.AddString(ErrStr(GetLastError())); //ErrStr是操作完成后返回信息的函数
//此时返回的信息是"重叠I/O操作在进行中"
UINT nIndex = 0;
m_strLog = _T("正在查找可用的USB设备...");
m_lstInfo.AddString(m_strLog);
SP_DEVICE_INTERFACE_DATA strtInterfaceData;
strtInterfaceData.cbSize =sizeof(SP_DEVICE_INTERFACE_DATA);
//for(int i=0;i<8;i++)
//{
BOOL bSuccess = SetupDiEnumDeviceInterfaces(hDevInfo,NULL,&guidHID,nIndex,
&strtInterfaceData);
if (!bSuccess)
{
m_lstInfo.AddString(ErrStr(GetLastError()));
//此时返回的信息是"没有可用的数据了",
//程序运行到此就结束了,无法找到可用的USB设备
m_strLog = _T("抱歉,未找到可用的USB设备");
m_lstInfo.AddString(m_strLog);
//SetupDiDestroyDeviceInfoList(hDevInfo);
//return;
}
else
{
// 若找到了设备,则读取设备路径名
SP_DEVICE_INTERFACE_DETAIL_DATA strtDetailData;
if (!SetupDiGetDeviceInterfaceDetail(hDevInfo,&strtInterfaceData,
&strtDetailData,sizeof(strtDetailData),NULL,NULL))
{
m_lstInfo.AddString(_T("查找设备路径时出错!"));
//SetupDiDestroyDeviceInfoList(hDevInfo);
//return;
}
else
{
// 找到了设备路径
m_strPath = strtDetailData.DevicePath;
m_strLog.Format("可以通过路径%s访问设备",m_strPath);
m_lstInfo.AddString(m_strLog);
// 开放与设备的通信
HANDLE hCom = CreateFile(m_strPath,GENERIC_READ | GENERIC_WRITE,
0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (hCom = INVALID_HANDLE_VALUE)
{
m_lstInfo.AddString(_T("无法打开通信端口"));
//SetupDiDestroyDeviceInfoList(hDevInfo);
//return;
}
else
{
// 查询设备标识
HIDD_ATTRIBUTES strtAttrib;
m_strLog = _T("正在读取设备的标识...");
m_lstInfo.AddString(m_strLog);
if (!HidD_GetAttributes(hCom,&strtAttrib))
{
m_lstInfo.AddString(_T("查询设备状态时出错!"));
//CloseHandle(hCom);
//SetupDiDestroyDeviceInfoList(hDevInfo);
//return;
}
else
{
// 将有关该设备的标识显示出来
m_strLog = _T("已读取有关该设备的标识:");
m_lstInfo.AddString(m_strLog);
// 显示供应商标识
m_strLog.Format("供应商标识:0x%x",strtAttrib.VendorID);
m_lstInfo.AddString(m_strLog);
// 显示产品标识
m_strLog.Format("产品标识:0x%x",strtAttrib.ProductID);
m_lstInfo.AddString(m_strLog);
// 显示产品版本号
m_strLog.Format("产品版本号:%d",strtAttrib.VersionNumber);
m_lstInfo.AddString(m_strLog);
}
}
// 释放资源
CloseHandle(hCom);
}
}
SetupDiDestroyDeviceInfoList(hDevInfo);
//}
//显示操作完成后返回信息的函数代码
CString CUSBCommDlg::ErrStr(DWORD ErrID)
{
LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
ErrID,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL);
CString strRet=(LPCTSTR)lpMsgBuf;
LocalFree(lpMsgBuf);
return strRet;
}