ppWizard。
(2)在MFC AppWizard-Step1窗口中,选择Dialog based选项,不该变其他选项的缺省值
(3)在MFC AppWizard-Step2 of 4窗口中,选择About box和3D controls复选框
(4)在MFC AppWizard-Step3 of 4到Step4 of 4不改变各个选项的缺省设置
(5)进入New Project Information窗口,如果检查完全正确后,单击OK按钮即生成应用程序所需要的全部文件。
通过上述操作便生成了基于对话框的工程USBPort。
3.2 查找USB设备
在应用程序能与HID交换数据之前,它先要找到设备,获取有关它的
报告信息。首先找到连接到
系统的HID是什么,然后检索信息,知道满足要求的属性。
(1)添加成员函数。单击ClassView标签,选定CUSBPortDlg类,右击添加OnSearch消息响应函数,并增加私有类型成员变量,即字符串型变量strPath和strLog以及布尔类型变量bFoundDevice。
(2)OnSearch函数调用API函数,HID类设备是通过GUID类型值作标识的,调用函数HidD_GetHidGuid颗获得HID设备的标识:Hidd_GetHidGuid(&;guidHID);
其中guidHID是指向GUID类型的指针,当函数返回后,它指向的内容就是HID类的GUID标识,GUID是16字节大小的结构,用来标识通信接口及类对象,它的定义为:
typedef struct _GUID
{
DWORD Data1;
WORD Data2;
WORD Data3;
BYTE Data4[8];
}GUID;
调用函数HidD_GetHidGuid获得特定的HID设备属性
BOOL HidD_GetAttributes(hCom,&;strAttrib);
其中hCom是对应与选定设备的句柄,根据这个句柄定所关心的设备,strAttrib则是指向HIDD_ATTRIBUTES类型的指针,当函数返回时即得到了指定设备的属性。
HIDD_ATTRIBUTES结构定义为:
typedef struc
t _HIDD_ATTRIBUTES
{
ULONG size;//这个HIDD_ATTRIBUTES变量大小,以字节为单位
USHORT vendorID;//致命HID设备的供应商标识
USHORT ProductID;//致命HID设备的产品标识
USHORT VersionNumber;//HID设备的版本号
}HIDD_ATTRIBUTES,*PHIDD_ATTRIBUTES;
OnSearch函数中还调用了其他与硬件相关的API函数,这些函数都在Setupapi.h中定义。调用SetupDiGetClassDevs函数用来获得一类硬件设备的信息:
HDEVINFO hDevInfo = SetupDiGetClassDevs(
&;guidHID,//这类设备配置或接口类GUID
NULL,//特定的字符串,用来选择符合条件的设备
0,//与获得信息相关的顶层窗体(Top_Level Window)句柄
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE//给出了设置信息集的方式
);
调用SetupDiEnumDeviceInterfaces函数得到一个设备接口信息反复调用得到所有设备接口信息。若要找到特定设备,可在循环语句内调用该函数,直到找到预期设备或函数返回FALSE值。
定义该函数:
BOOL bSuccess = SetupDiEnumDeviceInterface(
hDevInfo,//感兴趣的接口句柄
NULL,//指向SP_DEVINFO_DATA类型结构的指针,该结构限定了特定接口
&;gudiHID,//确定了接口的GUID标识
0,//所关心的索引号,以0为起点
&;strInterfaceData,//指向SP_DEVINFO_INTERFACE_DATA类型的指针,
它所指向的内容就是调用函数的目的所在,当函数返回时,strInterfaceData
指向的结构就存在相关接口的信息。
);
其中结构SP_DEVINFO_DATA定义为:
typedef struct _SP_DEVINFO_DATA{
DWORD cbsize;//指定结构的大小
GUID classGuid;//设备的GUID标识
DWORD DevInst;//用来访问设备的句柄
ULONG_PTR Reserved;
}SP_DEVINFO_DATA,*PSP_DEVINFO_DATA;
结构SP_DEVICE_INTERFACE_DATA定义为
typedef struct _SP_DEVICE_INTERFACE_DATA{
DOWRD cbsize;//是SP_DEVICE_INTERFACE_DATA结构的大小
GUID InterfaceClassGuid;//指定了接口的GUID标识
DWORD Flags;//接口所处状态
ULONG_PTR Reserved;
}SP_DEVICE_INTERFACE_DATA,*PSP_DEVICE_INTERFACE_DATA;