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





推荐阅读
  • 手把手教你构建简易JSON解析器
    本文将带你深入了解JSON解析器的构建过程,通过实践掌握JSON解析的基本原理。适合所有对数据解析感兴趣的开发者。 ... [详细]
  • 本文通过SystemTap工具详细分析了lvextend命令在SUSE12sp3系统上的执行流程。首先介绍了必要的软件安装步骤,随后展示了如何编写并运行SystemTap脚本来追踪命令执行过程中的函数调用,最后结合实际输出结果对关键函数进行了深入分析。 ... [详细]
  • 本文章介绍了如何将阿拉伯数字形式的金额转换为中国传统的大写形式,适用于财务报告和正式文件中的金额表示。 ... [详细]
  • 本文探讨了如何在Django中创建一个能够根据需求选择不同模板的包含标签。通过自定义逻辑,开发者可以在多个模板选项中灵活切换,以适应不同的显示需求。 ... [详细]
  • 本文探讨了在Android平台下编写和读取.JSON文件的方法,解决读取文件时遇到的字符间异常空格问题。 ... [详细]
  • VSCode中使用Clang-Format进行C/C++代码格式化配置
    本文介绍了如何在VSCode中配置Clang-Format以实现C/C++代码的自动格式化,包括安装必要的扩展、配置文件的创建以及常用设置的解释。建议阅读官方文档以获取更多详细信息。 ... [详细]
  • 本文探讨了在多媒体软件开发中处理大型WAV音频文件的策略。由于Windows提供的`sndPlaySound` API仅适用于小文件,对于大型WAV文件,我们介绍了使用MCI(Media Control Interface)命令的一种有效解决方案。 ... [详细]
  • CSV 文件的存取
    CSV文件介绍CSV(Comma-SeparatedValues),中文通常叫做逗号分割值。CSV文件由任意数目的记录(行& ... [详细]
  • 一.介绍string和CString均是字符串模板类,string为标准模板类(STL)定义的字符串类,已经纳入C标准之中 ... [详细]
  • 电子与正电子的相互作用
    本文探讨了电子与正电子之间的基本物理特性及其在现代物理学中的应用,包括它们的产生、湮灭过程以及在粒子加速器和宇宙射线中的表现。 ... [详细]
  • A题简单判断#includeusingnamespacestd;typedeflonglongll;intt;intmain(){cint;whil ... [详细]
  • STM32L4 HAL库UART串口读写及中断处理详解
    本文详细介绍了如何在STM32L4系列微控制器上使用HAL库实现UART串口的基本读写操作,以及通过中断和DMA模式提高数据传输效率的方法。 ... [详细]
  • 本文探讨了在Java中处理JSON数据的各种方法,包括APIJSON的使用案例,以及如何通过不同的工具和库实现JSON与Java对象之间的高效转换。 ... [详细]
  • 从零开始学重构——重构的流程及基础重构手法
    重构的流程重构手法  正如上一次所讲的那样,重构有两个基本条件,一是要保持代码在重构前后的行为基本不变,二是整个过程是受控且尽可能少地产生错误。尤其是对于第二点,产生了一系列的重构手 ... [详细]
  • 本文提供了一个Android应用中用于抓取网页信息并下载图片的示例代码。通过该代码,开发者可以轻松实现从指定URL获取网页内容及其中的图片资源。 ... [详细]
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社区 版权所有