SetupDiEnumDeviceInterfaces返回false WIN7/WIN8

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_DATA	pDevDetailData;

    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了.
		Result = SetupDiEnumDeviceInterfaces(hDevInfoSet, NULL, &HidGuid, MemberIndex, &DevInterfaceData);
		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_DATA	pDevDetailData;

    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 ;*/
			MemberIndex = 100;//循环次数
			while(MemberIndex--){
				Result = SetupDiEnumDeviceInterfaces(hDevInfoSet, NULL, &HidGuid, MemberIndex, &DevInterfaceData) ;
				if(Result == TRUE){
					break;
				}
			}

			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

时间: 2024-12-26 08:34:30

SetupDiEnumDeviceInterfaces返回false WIN7/WIN8的相关文章

64 位系统(win7/win8) 下使用C# 程序问题

1  C# 程序是控制台类,使用的组件如果是32位,建议在编译的时候,platform (X86,AnyCPU,X64)选择X86 .使用X86 模式编译,才能调用32位程序的API. 2  ASP.NET MVC 程序 platform 在发布之后,IIS7.0  以上,需要把站点的应用程序池基本设置项 "Enable 32-Bit Applications", 设置为true,默认是false. 使用ASP.NET MVC 3  : 必须安装 .net framework 4: 使

ImageMagick: win7 | win8 & uac (用户帐户控制) 注册表的一些事

现在用win7,win8的人越来越多了, 程序在一些 win 7, win8 上运行会遇到一些之前没想过的兼容性问题. 比如 64位系统运行32位程序时的注册表重定向,还有因为 uac (用户帐户控制)注册表的重定向等. ImageMagick 在安装的时候,相关数据写在 HKEY_LOCAL_MACHINE 下面, 这在 xp 系统下,一般不会出什么问题. 但由于在 win7,win8上,由于64位系统或uac的问题,导致注册表的路径重定向, 特别是 uac 问题,要想将数据保存到HKEY_L

PL/SQL在win7/win8 x64位下使用客户端连接oracle

新做了win8 x64位的系统.需要使用plsql连接oracle数据库.之前的机器装有64位的oracle11g,plsql可以直接找到oracle_home连接到数据库. 这次不想在本地安装数据库,因此只装了一个32位的数据库客户端.配置环境变量时遇到一些小问题,在此记录下来. 1.下载oracle客户端,然后解压到任意目录下 2.安装好plsql,然后配置plsql的oracle_home和oci库的地址 plsql的preference设置 ORACLE_HOME:F:\oracle\p

FtpClient.storeFile返回false解决方法

参考:http://www.cnblogs.com/xiangpiaopiao2011/archive/2012/02/28/2371679.html 返回错误:ftp connect time out. 先判断是否登录成功,若登录成功之后FtpClient.storeFile还返回false,则参考下面代码 ftpClient.enterLocalPassiveMode();ftpClient.setControlEncoding("UTF-8");boolean stored =

【解决】UEFI+GPT模式下装系统(WIN7/WIN8)

最近在家想把联想超极本重装系统,可是发现想简单了,预装WIN8的本本用的是UEFI+GPT模式,以前老毛桃装系统那一套不好用了,所以百度了一些方案,还没试,先记着. 1. WIN8 先说装WIN8,貌似比较简单,参考: http://www.pcbeta.com/forum.php?mod=viewthread&tid=1415388 2. WIN7 预装WIN8的机子要装WIN7,有些麻烦,但是貌似找到了一个挺靠谱的教程 先制作启动U盘的PE: http://sphrbeu2012.blog.

解决Win7&Win8 64位下Source Insight提示未完整安装的问题[转]

转自:http://www.cnblogs.com/sixiweb/p/3421533.html 网上的破解版的注册表文件都是针对32位系统的,所以在64位系统里运行根本无法破解.下面分别贴出这俩系统里的破解文件. 使用方法: 分别复制对应系统的内容,新建文本文档,将内容粘贴进去,重命名为.reg文件,双击运行,弹出提示窗口,点击“确定”,整个世界都清净了. Win7&Win8 64bit: Windows Registry Editor Version 5.00 [HKEY_LOCAL_MAC

[转载] 在java中为什么变量1000 = 1000 返回false,但是100=100返回true?

ps:题目的意思是指定义相同内容的不同变量之间的==比较.如果直接比较(1000 == 1000)的结果是true. 运行以下代码: Integer a = 1000, b = 1000; System.out.println(a == b); Integer c = 100, d = 100; System.out.println(c == d); 结果是: false true 我们知道,如果两个引用指向不同的对象,即使对象拥有相同的内容时,他们用==比较的结果就是不相等(返回false).

Win7/Win8.1预订升级Win10失败临时解决方案

很多Win7/Win8.1用户在今天凌晨通过微软官方推送的方式升级Win10,但这一过程中遇到了“安装失败”等问题,导致升级无法进行.鉴于这种情况,很多用户选择进入Windows10预下载安装文件夹打算手动安装.不过此时新问题又来了,那就是安装程序声称缺少boot.wim文件,因而无法安装. 不过有机智的用户 把Win10安装程序下载临时文件夹“C:\$Windows.~BT\”复制到其他分区后,启动其中source文件夹内的setupre.exe程序就可以进行正常安装. 但 也有用户表示,“$

ModelState.IsValid返回false解决办法

ModelState.IsValid一直返回false时,怎么查找都找不到原因,可以通过如下方法查找出到底是哪个地方出的错误,对症下药 public static List<string> GetErrorListFromModelState (ModelStateDictionary modelState) { var query = from state in modelState.Values from error in state.Errors select error.ErrorMe