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

赞助

如果您认为以上内容对您有所帮助或者您心情好,不妨支持我一下,谢谢。pay



1 0
原创粉丝点击