SetupDiEnumDeviceInterfaces返回false WIN7/WIN8
来源:互联网 发布:瑞典大学排名 知乎 编辑:程序博客网 时间:2024/04/29 19:23
The SetupDiEnumDeviceInterfaces function enumerates the device interfaces that are contained in a device information set.
BOOL SetupDiEnumDeviceInterfaces( _In_ HDEVINFO DeviceInfoSet, _In_opt_ PSP_DEVINFO_DATA DeviceInfoData, _In_ const GUID *InterfaceClassGuid, _In_ DWORD MemberIndex, _Out_ PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData);
问题1:第一次返回的是TRUE,但第二次返回的却是FALSE了,好奇怪...
问题代码:
BOOL Cusb::openDevice(DWORD dwVid, DWORD dwPid) { m_hReadHandle=INVALID_HANDLE_VALUE;m_hWriteHandle=INVALID_HANDLE_VALUE;m_hReadEvent=CreateEvent(NULL,TRUE,FALSE,NULL);m_hWriteEvent=CreateEvent(NULL,TRUE,FALSE,NULL);TCHAR MyDevPathName[MAX_PATH];GUID HidGuid;HDEVINFO hDevInfoSet;DWORD MemberIndex;SP_DEVICE_INTERFACE_DATA DevInterfaceData;BOOL Result;DWORD RequiredSize;PSP_DEVICE_INTERFACE_DETAIL_DATApDevDetailData; hDevHandle =INVALID_HANDLE_VALUE;HIDD_ATTRIBUTES DevAttributes;BOOL MyDevFound=FALSE;bOpScucess =false;m_hReadHandle=INVALID_HANDLE_VALUE;m_hWriteHandle=INVALID_HANDLE_VALUE; _tcscpy(DevPathName, ""); try {DevInterfaceData.cbSize=sizeof(DevInterfaceData);DevAttributes.Size=sizeof(DevAttributes);HidD_GetHidGuid(&HidGuid);hDevInfoSet=SetupDiGetClassDevs(&HidGuid, NULL, NULL, DIGCF_DEVICEINTERFACE|DIGCF_PRESENT) ;MemberIndex=0 ;int i=0 ;while(1){//防止进入死循环i++ ;if(i>3){return FALSE ;}Sleep(20) ; try { //这里运行的时候,当MemberIndex为2时就返回FALSE了.<span style="background-color: rgb(255, 0, 0);">Result = SetupDiEnumDeviceInterfaces(hDevInfoSet, NULL, &HidGuid, MemberIndex, &DevInterfaceData) ;</span>if(FALSE == Result) break ;MemberIndex++ ;Result = SetupDiGetDeviceInterfaceDetail(hDevInfoSet, &DevInterfaceData, NULL, NULL, &RequiredSize, NULL) ;pDevDetailData=(PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(RequiredSize) ;if(NULL == pDevDetailData){SetupDiDestroyDeviceInfoList(hDevInfoSet) ;return FALSE;}pDevDetailData->cbSize=sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);Result = SetupDiGetDeviceInterfaceDetail(hDevInfoSet, &DevInterfaceData, pDevDetailData, RequiredSize, NULL, NULL) ;_tcscpy(MyDevPathName, pDevDetailData->DevicePath);_tcscpy(DevPathName, pDevDetailData->DevicePath);free(pDevDetailData) ;if(FALSE == Result){continue ;}} catch (CException* e) {return MyDevFound; }try{hDevHandle=CreateFile(MyDevPathName, NULL, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL) ;if(INVALID_HANDLE_VALUE == hDevHandle){continue ;}PHIDP_PREPARSED_DATA preparseData;HidD_GetPreparsedData(hDevHandle,&preparseData);HIDP_CAPS caps;HidP_GetCaps(preparseData,&caps);Result = HidD_GetAttributes(hDevHandle, &DevAttributes);CloseHandle(hDevHandle);if(Result == FALSE) continue ;}catch (CException* e){return MyDevFound;}try{if( (DevAttributes.VendorID == dwVid) && (DevAttributes.ProductID == dwPid) ){MyDevFound=TRUE;m_hReadHandle=CreateFile(MyDevPathName, NULL, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL) ;//int nError =GetLastError();if(m_hReadHandle==INVALID_HANDLE_VALUE){return FALSE ;}m_hWriteHandle=CreateFile(MyDevPathName, GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL,OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL) ;if(m_hWriteHandle==INVALID_HANDLE_VALUE){return FALSE;}break;}SetupDiDestroyDeviceInfoList(hDevInfoSet);}catch (CException* e){return MyDevFound;}} if (MyDevFound) //如果找到设备,启动线程读取{/* //启动不读取数据,发一包读一包 DWORD dwhThread; if (m_hReadDataHandle ==INVALID_HANDLE_VALUE) { bReadData =true; m_hReadDataHandle =::CreateThread(NULL,0,ReadUsbData,this,0,&dwhThread); } */ bOpScucess =true; StartThread();}} catch (CMemoryException* e){return MyDevFound;}catch (CFileException* e){return MyDevFound;}catch (CException* e){return MyDevFound;} bOpScucess =true;return MyDevFound; }解决办法:
BOOL Cusb::openDevice(DWORD dwVid, DWORD dwPid) { m_hReadHandle=INVALID_HANDLE_VALUE;m_hWriteHandle=INVALID_HANDLE_VALUE;m_hReadEvent=CreateEvent(NULL,TRUE,FALSE,NULL);m_hWriteEvent=CreateEvent(NULL,TRUE,FALSE,NULL);TCHAR MyDevPathName[MAX_PATH];GUID HidGuid;HDEVINFO hDevInfoSet;DWORD MemberIndex;SP_DEVICE_INTERFACE_DATA DevInterfaceData;BOOL Result;DWORD RequiredSize;PSP_DEVICE_INTERFACE_DETAIL_DATApDevDetailData; hDevHandle =INVALID_HANDLE_VALUE;HIDD_ATTRIBUTES DevAttributes;BOOL MyDevFound=FALSE;bOpScucess =false;m_hReadHandle=INVALID_HANDLE_VALUE;m_hWriteHandle=INVALID_HANDLE_VALUE; _tcscpy(DevPathName, ""); try {DevInterfaceData.cbSize=sizeof(DevInterfaceData);DevAttributes.Size=sizeof(DevAttributes);HidD_GetHidGuid(&HidGuid);hDevInfoSet=SetupDiGetClassDevs(&HidGuid, NULL, NULL, DIGCF_DEVICEINTERFACE|DIGCF_PRESENT) ;MemberIndex=0 ;int i=0 ;while(1){//防止进入死循环i++ ;if(i>3){return FALSE ;}Sleep(20) ; try { /*Result = SetupDiEnumDeviceInterfaces(hDevInfoSet, NULL, &HidGuid, MemberIndex, &DevInterfaceData) ;if(FALSE == Result) break ;*/<span style="color:#FF6666;">MemberIndex = 100;//循环次数while(MemberIndex--){Result = SetupDiEnumDeviceInterfaces(hDevInfoSet, NULL, &HidGuid, MemberIndex, &DevInterfaceData) ;if(Result == TRUE){break;}}</span>if(FALSE == Result) {char szError[256];DWORD dwError = GetLastError();FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,NULL,dwError,0,szError,sizeof(szError),NULL);AfxMessageBox(szError);break ;}MemberIndex++ ;Result = SetupDiGetDeviceInterfaceDetail(hDevInfoSet, &DevInterfaceData, NULL, NULL, &RequiredSize, NULL) ;pDevDetailData=(PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(RequiredSize) ;if(NULL == pDevDetailData){SetupDiDestroyDeviceInfoList(hDevInfoSet) ;return FALSE;}pDevDetailData->cbSize=sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);Result = SetupDiGetDeviceInterfaceDetail(hDevInfoSet, &DevInterfaceData, pDevDetailData, RequiredSize, NULL, NULL) ;_tcscpy(MyDevPathName, pDevDetailData->DevicePath);_tcscpy(DevPathName, pDevDetailData->DevicePath);free(pDevDetailData) ;if(FALSE == Result){continue ;}} catch (CException* e) {return MyDevFound; }try{hDevHandle=CreateFile(MyDevPathName, NULL, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL) ;if(INVALID_HANDLE_VALUE == hDevHandle){continue ;}PHIDP_PREPARSED_DATA preparseData;HidD_GetPreparsedData(hDevHandle,&preparseData);HIDP_CAPS caps;HidP_GetCaps(preparseData,&caps);Result = HidD_GetAttributes(hDevHandle, &DevAttributes);CloseHandle(hDevHandle);if(Result == FALSE) continue ;}catch (CException* e){return MyDevFound;}try{if( (DevAttributes.VendorID == dwVid) && (DevAttributes.ProductID == dwPid) ){MyDevFound=TRUE;m_hReadHandle=CreateFile(MyDevPathName, NULL, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL) ;//int nError =GetLastError();if(m_hReadHandle==INVALID_HANDLE_VALUE){return FALSE ;}m_hWriteHandle=CreateFile(MyDevPathName, GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL,OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL) ;if(m_hWriteHandle==INVALID_HANDLE_VALUE){return FALSE;}break;}SetupDiDestroyDeviceInfoList(hDevInfoSet);}catch (CException* e){return MyDevFound;}} if (MyDevFound) //如果找到设备,启动线程读取{/* //启动不读取数据,发一包读一包 DWORD dwhThread; if (m_hReadDataHandle ==INVALID_HANDLE_VALUE) { bReadData =true; m_hReadDataHandle =::CreateThread(NULL,0,ReadUsbData,this,0,&dwhThread); } */ bOpScucess =true; StartThread();}} catch (CMemoryException* e){return MyDevFound;}catch (CFileException* e){return MyDevFound;}catch (CException* e){return MyDevFound;} bOpScucess =true;return MyDevFound; }问题2:在WIN7下运行正常,在WIN8下就出错。
解决办法:
判断其是否为Win8系统
bool GetOsWin8(){OSVERSIONINFOEX osvi;BOOL bOsVersionInfoEx;ZeroMemory(&osvi,sizeof(OSVERSIONINFOEX));osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO*)&osvi);if(VER_PLATFORM_WIN32_NT == osvi.dwPlatformId && osvi.dwMajorVersion > 6 && osvi.dwMinorVersion == 0){return true;}else if(VER_PLATFORM_WIN32_NT == osvi.dwPlatformId && osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 2){return true;}else{return false;}}
最后上传源码供查看:files.cnblogs.com/royaldesigner/usb.zip
赞助
如果您认为以上内容对您有所帮助或者您心情好,不妨支持我一下,谢谢。
1 0
- SetupDiEnumDeviceInterfaces返回false WIN7/WIN8
- 函数 SetupDiEnumDeviceInterfaces 总返回false
- 国外网站上解决SetupDiEnumDeviceInterfaces返回false的方法 (转)
- SetupDiEnumDeviceInterfaces function
- PacketGetAdapterNames返回false
- file_get_contents() 返回 false 解决
- bindService返回false问题
- ISSYS_MODIFIABLE 返回false
- curl 返回false
- mysql_real_escape_string总是返回false
- mysql_query返回false原因
- <Win32> Process32First 返回FALSE
- php simplexml_load_string 返回false
- Windows下USB磁盘开发系列四:SetupDiEnumDeviceInterfaces()返回ERROR_NO_MORE_ITEMS 259错误代码的原因
- win8+win7双系统
- Win8对比Win7
- win7和win8区别
- win7和win8双系统
- GregoranCalandar类(java核心P103)
- Cordova配置自己的Plugin
- 我的Android日记(一),获取Android版本号
- 杂记
- oracle job 定时执行 存储过程
- SetupDiEnumDeviceInterfaces返回false WIN7/WIN8
- Handler的使用
- 关于TCP/IP数据包结构一文的进一步说明(常见协议数据报结构及TCP三次握手机制)
- 移动端性能大比拼:CSS Sprites vs. Data URI
- Datamine软件及功能介绍(转)
- 2011考研复试分数线发布时间:预计…
- ogre里面的点到面的距离
- 常量
- 关于模型减面