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





推荐阅读
  • Lua基本语法lua与C#的交互(相当简单详细的例子)
    lua脚本与C#的交互本文提供全流程,中文翻译。Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验——高分辨率用户请根据需求调整网页缩放比例)1LuaAndC#——L ... [详细]
  • 本文详细介绍了中心方形数的概念及其计算方法,并提供了多种编程语言下的实现代码。 ... [详细]
  • 【java】关键字、代码块、接口、枚举学习笔记
    主要内容1关键字2代码块3接口4枚举1Java中的关键字1.1static关键字用一句话说就是:可以直接通过对象.的形式使用,不用new实 ... [详细]
  • 使用Python模拟登录教务系统抓取成绩并分析存储
    本文详细介绍如何使用Python编程语言模拟登录学校教务系统,抓取学生的成绩信息,并进行数据分析和可视化处理,最终将数据存储到MySQL数据库中。 ... [详细]
  • 深入解析 Android 中的 ActivityGroup 实现
    本文详细探讨了如何在 Android 应用中使用 ActivityGroup 来实现类似微博客户端主界面的效果,并分析了 TabActivity 的局限性,推荐使用更为灵活的 ActivityGroup 方案。 ... [详细]
  • 本文探讨了在Vue项目中使用BetterScroll时,由于网络请求慢导致滚动区域无法正常滑动的原因及解决方案。重点介绍了通过监听图片加载事件并调用refresh方法来解决这一问题的方法。 ... [详细]
  • Oracle中打开10046Trace的各种方法10046trace的跟踪等级10046是一个Oracle的内部事件(event),通过设置这个事件可以得到Oracl ... [详细]
  • 本文详细介绍了Java编程语言中的关键字及其用途,包括53个关键字和2个保留字。文章不仅解释了每个关键字的基本功能,还提供了实际应用场景中的使用示例。 ... [详细]
  • 本文介绍了如何在React应用中实现延迟加载以提高性能,以及如何利用自定义Hook和高阶组件(HOC)来增强组件功能。通过这些技术,开发者可以构建更加高效和可维护的应用。 ... [详细]
  • 如何清空Layui树结构
    本文将详细介绍如何使用Layui框架清空树形结构,包括创建树、添加节点以及实现清空功能的具体步骤。通过本文,您将能够掌握Layui树的管理技巧。 ... [详细]
  • POJ2226 二分图最小覆盖问题
    在一个大小为n×m的网格中,部分单元格为泥泞状态,其余为干净。目标是使用宽度固定为1但长度可变的木板覆盖所有泥泞单元格,且不覆盖任何干净单元格。木板允许重叠。本问题通过构建二分图并求其最小覆盖来解决。 ... [详细]
  • 本文探讨了如何利用 Application 对象在 PHP 应用程序中共享数据,特别是在多用户环境中保持数据的一致性和安全性。文章还介绍了 Application 对象的基本结构、方法和事件,并提供了实际应用示例。 ... [详细]
  • 深入解析ASP.NET中的HttpHandler、HttpModule与IHttpHandlerFactory
    本文探讨了ASP.NET页面生命周期中的关键组件——HttpHandler、HttpModule和IHttpHandlerFactory的工作原理及其应用场景。通过实例分析,帮助读者更好地理解和利用这些组件来优化Web应用程序。 ... [详细]
  • 实践指南:利用Jenkins与JMeter实现自动化测试报告通知
    本文详细介绍了如何结合Jenkins和JMeter工具,通过自定义脚本向用户发送测试报告的通知。这不仅提高了开发团队的工作效率,也确保了信息的及时传递。 ... [详细]
  • 本文档详细介绍了Excel VBA编程中的基本语法,包括循环结构、条件判断、数据处理以及用户界面设计等内容,旨在帮助初学者快速掌握VBA编程技巧。 ... [详细]
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社区 版权所有