热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

请高手帮忙解答一下,调用SetupDiGetDeviceInterfaceDetail出现错误(vb.net)

HidD_GetHidGuid(guidHID)hDevInfoSetupDiGetClassDevs(guidHID,0,0,DIGCF.DIGCF_PRESENTOrDIGCF



HidD_GetHidGuid(guidHID)

hDevInfo = SetupDiGetClassDevs(guidHID, 0, 0, DIGCF.DIGCF_PRESENT Or DIGCF.DIGCF_DEVICEINTERFACE)



DeviceInterfaceData.cbSize = Marshal.SizeOf(GetType(SP_DEVICE_INTERFACE_DATA))

DetailData.cbSize = Marshal.SizeOf(GetType(SP_DEVICE_INTERFACE_DETAIL_DATA))

strtInterfaceData.cbSize = Marshal.SizeOf(GetType(SP_DEVINFO_DATA))



result = SetupDiEnumDeviceInterfaces(hDevInfo, 0, guidHID, MemberIndex, DeviceInterfaceData)



--这之前的运行都是没有问题的



result = SetupDiGetDeviceInterfaceDetail(hDevInfo, DeviceInterfaceData, DetailData, 0, bufferSize, strtInterfaceData)

--第一遍调用说成功

result = SetupDiGetDeviceInterfaceDetail(hDevInfo, DeviceInterfaceData, DetailData, bufferSize, bufferSize, strtInterfaceData)

--第二遍调用说提供给请求操作的用户缓冲区无效



下面是其中结构体的定义以及函数的调用

    

    Public Structure SP_DEVICE_INTERFACE_DATA

        Public cbSize As UInteger

        Public interfaceClassGuid As Guid

        Public flags As UInteger

        Public reserved As IntPtr

    End Structure



    

    Public Structure SP_DEVINFO_DATA

        Public cbSize As Integer

        Public classGuid As Guid

        Public propertyId As Integer

        Public reserved As IntPtr

    End Structure



    

    Public Structure SP_DEVICE_INTERFACE_DETAIL_DATA

        Public cbSize As UInt32

         Public DevicePath As String

    End Structure



--函数

    

    Private Shared Function SetupDiGetClassDevs(

        ByRef ClassGuid As Guid,

        ByVal Enumerator As Integer,

        ByVal hwndParent As Integer,

        ByVal Flags As Integer) As IntPtr

    End Function



    

    Public Shared Function SetupDiEnumDeviceInterfaces(

                                                      ByVal hDevInfo As IntPtr,

                                                      ByVal devInfo As Integer,

                                                      ByRef interfaceClassGuid As Guid,

                                                      ByVal memberIndex As UInt32,

                                                      ByRef deviceInterfaceData As SP_DEVICE_INTERFACE_DATA) As Boolean

    End Function



    Public Declare Auto Function SetupDiGetDeviceInterfaceDetail Lib "setupapi.dll" Alias "SetupDiGetDeviceInterfaceDetailW" (

                                                       ByVal hDevInfo As IntPtr,

                                                       ByRef deviceInterfaceData As SP_DEVICE_INTERFACE_DATA,

                                                       ByRef deviceInterfaceDetailData As SP_DEVICE_INTERFACE_DETAIL_DATA,

                                                       ByVal deviceInterfaceDetailDataSize As Int32,

                                                       ByRef requiredSize As Int32,

                                                       ByRef deviceInfoData As SP_DEVINFO_DATA) As Boolean




6 个解决方案





#1





你看下第一次调用后 bufferSize是多少

还有DetailData.cbSize的值是多少



这些值出现异常都是读不到的




#2





detaildata.cbsize 是260

buffersize是0




#3







引用 1 楼 stherix 的回复:

你看下第一次调用后 bufferSize是多少

还有DetailData.cbSize的值是多少



这些值出现异常都是读不到的



detaildata.cbsize 是260

buffersize是0 




#4







引用 2 楼 Chingle1990 的回复:

detaildata.cbsize 是260

buffersize是0





这应该是不对的



第一次调用SetupDiGetDeviceInterfaceDetail ,它会返回实际需要的缓冲区大小,值会写入到buffersize

而你发现返回的buffersize大小为0

说明根本没有数据,或者是哪里出错了,




#5







引用 4 楼 stherix 的回复:


Quote: 引用 2 楼 Chingle1990 的回复:


detaildata.cbsize 是260

buffersize是0





这应该是不对的



第一次调用SetupDiGetDeviceInterfaceDetail ,它会返回实际需要的缓冲区大小,值会写入到buffersize

而你发现返回的buffersize大小为0

说明根本没有数据,或者是哪里出错了,





Public Declare Auto Function SetupDiGetDeviceInterfaceDetail Lib "setupapi.dll" Alias "SetupDiGetDeviceInterfaceDetailW" _

        (ByVal hDevInfo As IntPtr,

         ByRef deviceInterfaceData As SP_DEVICE_INTERFACE_DATA,

         ByvaldeviceInterfaceDetailData As IntPtr,

         ByVal deviceInterfaceDetailDataSize As Int32,

         ByRef requiredSize As Int32,

         ByVal deviceInfoData As IntPtr) As Boolean

我把函数定义改成这样,然后引用

                result = SetupDiGetDeviceInterfaceDetail(hDevInfo, DeviceInterfaceData, IntPtr.Zero, 0, bufferSize, IntPtr.Zero)



                DetailData.cbSize = Marshal.SizeOf(GetType(SP_DEVICE_INTERFACE_DETAIL_DATA))

                strtInterfaceData.cbSize = Marshal.SizeOf(GetType(SP_DEVINFO_DATA))



                detailDataBuffer = Marshal.AllocHGlobal(bufferSize)

                Marshal.StructureToPtr(DetailData, detailDataBuffer, False)



                result = SetupDiGetDeviceInterfaceDetail(hDevInfo, DeviceInterfaceData, detailDataBuffer, bufferSize, bufferSize, IntPtr.Zero)

这样显示buffersize192,但是第二遍调用后的错误还是一样的









#6





问题找到了 需要这样

If (IntPtr.Size = 8) Then

                    DetailData.cbSize = 8

                Else

                    DetailData.cbSize = 4 + Marshal.SystemDefaultCharSize

                End If

marshal.sizeof的问题有点多啊说实话





推荐阅读
  • 获取计算机硬盘序列号的方法与实现
    本文介绍了如何通过编程方法获取计算机硬盘的唯一标识符(序列号),并提供了详细的代码示例和解释。此外,还涵盖了如何使用这些信息进行身份验证或注册保护。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ... [详细]
  • 本文探讨了在C++中如何有效地清空输入缓冲区,确保程序只处理最近的输入并丢弃多余的输入。我们将介绍一种不阻塞的方法,并提供一个具体的实现方案。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • C++: 实现基于类的四面体体积计算
    本文介绍如何使用C++编程语言,通过定义类和方法来计算由四个三维坐标点构成的四面体体积。文中详细解释了四面体体积的数学公式,并提供了两种不同的实现方式。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • 本文探讨了 Objective-C 中的一些重要语法特性,包括 goto 语句、块(block)的使用、访问修饰符以及属性管理等。通过实例代码和详细解释,帮助开发者更好地理解和应用这些特性。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 本文详细介绍了Java中的访问器(getter)和修改器(setter),探讨了它们在保护数据完整性、增强代码可维护性方面的重要作用。通过具体示例,展示了如何正确使用这些方法来控制类属性的访问和更新。 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 在过去两周中,我们利用 ReportViewer 开发了与生产良率相关的报表,其中每个制程的直通率是所有测试项良率的乘积。由于 ReportViewer 没有内置的累乘函数,因此需要借助自定义代码来实现这一功能。本文将详细介绍实现步骤和相关代码。 ... [详细]
  • 本次考试于2016年10月25日上午7:50至11:15举行,主要涉及数学专题,特别是斐波那契数列的性质及其在编程中的应用。本文将详细解析考试中的题目,并提供解题思路和代码实现。 ... [详细]
  • 不确定性|放入_华为机试题 HJ9提取不重复的整数
    不确定性|放入_华为机试题 HJ9提取不重复的整数 ... [详细]
author-avatar
aloneloveu2005
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有