阅读:1246回复:1
USB通信的问题,大牛来帮帮忙!(源码附上)
USB通信的问题,大牛来帮帮忙!(源码附上)
原来我做USB通信一般找逻辑盘符得到设备的句柄,再用DeviceIoControl来发SCSI命令,相信同行们很多都用过. 现在这个设备没有逻辑盘符(郁闷),看了网上资料用DDK,函数SetupDiGetClassDevs(),源码在后面,问题是现在我找不到设备的句柄,我想找到设备的句柄再用DeviceIoControl()来发SCSI命令,但是SetupDiGetClassDevs()得到的hDevInfo好像是所有USB设备列表,能找到单个USB设备的句柄吗? #include <tchar.h> #include <stdio.h> #include <windows.h> #include <devguid.h> #define DWORD_PTR DWORD #define ULONG_PTR DWORD extern "C" { #include "hidsdi.h" } // 需加入hid.lib #include <setupapi.h> // 需加入setupapi.lib #include <regstr.h> #include <winbase.h> #include <cfgmgr32.h> // 需要加入cfgmgr32.lib #include <initguid.h> //#include <usbiodef.h> DEFINE_GUID(GUID_DEVINTERFACE_USB_DEVICE, 0xA5DCBF10L, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED); #define GUID_CLASS_USB_DEVICE GUID_DEVINTERFACE_USB_DEVICE int main(int argc, _TCHAR* argv[]) { HDEVINFO hDevInfo; SP_DEVINFO_DATA DeviceInfoData; DWORD i; //-------------------------------------------------------------------------- // 获取设备信息 hDevInfo = SetupDiGetClassDevs((LPGUID)&GUID_CLASS_USB_DEVICE, 0, // Enumerator 0, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE ); if (hDevInfo == INVALID_HANDLE_VALUE) { // 查询信息失败 printf("ERROR - SetupDiGetClassDevs()"); return 1; } //-------------------------------------------------------------------------- // 枚举每个USB设备 DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); for (i=0;SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData);i++) { LPTSTR buffer = NULL; PVOID buffer2 = NULL; DWORD buffersize = 0; ULONG len; CONFIGRET cr; PNP_VETO_TYPE pnpvietotype; CHAR vetoname[MAX_PATH]; ULONG ulStatus; ULONG ulProblemNumber; cr = CM_Get_DevNode_Status( &ulStatus, &ulProblemNumber, DeviceInfoData.DevInst, 0); if ( CR_SUCCESS == cr ) { printf("OK - CM_Get_DevNode_Status()[%d]\n", cr); printf("OK - CM_Get_DevNode_Status() sts [%x]\n", ulStatus); printf("OK - CM_Get_DevNode_Status() pro [%x]\n", ulProblemNumber); } else { printf("ERROR - CM_Get_DevNode_Status()[%d]\n", cr); printf("ERROR - CM_Get_DevNode_Status()[%d]\n", GetLastError()); } // DN_DISABLEABLE or DN_REMOVABLE if ((DN_DISABLEABLE & ulStatus ) != 0 ) { printf("HAS - DN_DISABLEABLE()[%x]\n", DN_DISABLEABLE & ulStatus); } else { continue; } if ((DN_REMOVABLE & ulStatus ) != 0 ) { printf("HAS - DN_REMOVABLE()[%x]\n", DN_REMOVABLE & ulStatus); } else { continue; } len = MAX_PATH; // pnpvietotype = PNP_VetoDevice; cr = CM_Request_Device_Eject( DeviceInfoData.DevInst, &pnpvietotype, vetoname, len, 0 ); if ( CR_SUCCESS == cr ) { printf("OK - CM_Request_Device_Eject()[%d]\n", cr); } else { printf("ERROR - CM_Request_Device_Eject()[%d]\n", cr); printf("ERROR - CM_Request_Device_Eject()[%d]\n", GetLastError()); } } if ( GetLastError()!=NO_ERROR && GetLastError()!=ERROR_NO_MORE_ITEMS ) { // Insert error handling here. return 1; } // Cleanup SetupDiDestroyDeviceInfoList(hDevInfo); return 0; } |
|
沙发#
发布于:2007-01-09 16:18
我想可以用这个DDK函数SetupDiGetDeviceInterfaceDetail来获取你要的USB的HANDLE.
|
|