热门标签 | 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的问题有点多啊说实话





推荐阅读
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • 本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 本文详细介绍了Java中的输入输出(IO)流,包括其基本概念、分类及应用。IO流是用于在程序和外部资源之间传输数据的一套API。根据数据流动的方向,可以分为输入流(从外部流向程序)和输出流(从程序流向外部)。此外,还涵盖了字节流和字符流的区别及其具体实现。 ... [详细]
  • 本文探讨了在C++中如何有效地清空输入缓冲区,确保程序只处理最近的输入并丢弃多余的输入。我们将介绍一种不阻塞的方法,并提供一个具体的实现方案。 ... [详细]
  • 对象自省自省在计算机编程领域里,是指在运行时判断一个对象的类型和能力。dir能够返回一个列表,列举了一个对象所拥有的属性和方法。my_list[ ... [详细]
  • Qt QTableView 内嵌控件的实现方法
    本文详细介绍了在 Qt QTableView 中嵌入控件的多种方法,包括使用 QItemDelegate、setIndexWidget 和 setIndexWidget 结合布局管理器。每种方法都有其适用场景和优缺点。 ... [详细]
  • 本文介绍了如何在 Node.js 中使用 `setDefaultEncoding` 方法为可写流设置默认编码,并提供了详细的语法说明和示例代码。 ... [详细]
  • 本教程涵盖OpenGL基础操作及直线光栅化技术,包括点的绘制、简单图形绘制、直线绘制以及DDA和中点画线算法。通过逐步实践,帮助读者掌握OpenGL的基本使用方法。 ... [详细]
  • ###问题删除目录时遇到错误提示:rm:cannotremoveusrlocaltmp’:Directorynotempty即使用rm-rf,还是会出现 ... [详细]
  • 不确定性|放入_华为机试题 HJ9提取不重复的整数
    不确定性|放入_华为机试题 HJ9提取不重复的整数 ... [详细]
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • 在软件开发过程中,MD5加密是一种常见的数据保护手段。本文将详细介绍如何在C#中使用两种不同的方式来实现MD5加密:字符串加密和流加密。 ... [详细]
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社区 版权所有