【问题标题】:vb .net, passing enum value as function parametervb .net,将枚举值作为函数参数传递
【发布时间】:2012-12-28 09:34:25
【问题描述】:

这编译没有错误,但是当我运行这个代码部分时出现了一些奇怪的错误:

检测到致命的执行引擎错误 消息:运行时遇到致命错误。错误地址位于线程 0xd7c 上的 0x792062fb。错误代码为 0xc0000005。此错误可能是 CLR 或用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括 COM-interop 或 PInvoke 的用户封送错误,这可能会损坏堆栈。

我尝试如下:

    Public Enum PipePolicyType
        SHORT_PACKET_TERMINATE = 1
        AUTO_CLEAR_STALL = 2
        PIPE_TRANSFER_TIMEOUT = 3
        IGNORE_SHORT_PACKETS = 4
        ALLOW_PARTIAL_READS = 5
        AUTO_FLUSH = 6
        RAW_IO = 7
        RESET_PIPE_ON_RESUME = 9
    End Enum

...
...

        Dim a As UInt32 = 3000

        SetPolicy(1, PIPE_TRANSFER_TIMEOUT, a)

...
...
Public Sub SetPolicy(ByVal ep As Integer, ByVal PolicyType As PipePolicyType, ByVal PolicyValue As UInt32)


end sub

怎么了?

【问题讨论】:

  • 用 SetPolicy(1, 3, a) 试试看是否报错。
  • 也可以试试SetPolicy(1, PipePolicyType.PIPE_TRANSFER_TIMEOUT, a)
  • 如果您能指出这是您正在调用/调用的 Win32 函数,那就太好了
  • 实际上没有调用任何东西(这是为了测试而注释掉),但我打算调用 winusb_setpolicy()。现在最初导入的作品,但 const 如下: WinUsb_SetPipePolicy(hWinUSBInterface, ep, &H3, 4, timeout) 我尝试用一​​些人类可读的 consts 替换参数
  • SetPolicy(1, 3, a) 会给我:重载解析失败,因为没有缩小转换就无法调用可访问的“SetPolicy”:......有两个函数将 PolicyValue 作为布尔值或作为uint32

标签: vb.net


【解决方案1】:

好的,我完全在其他地方发现了问题,我不明白。我的枚举完全没有问题,在一些非托管的包装器中出现了一些奇怪的错误:

    Dim PUnmanagedDetailedInterfaceDataStructure As IntPtr = IntPtr.Zero
    PUnmanagedDetailedInterfaceDataStructure = Marshal.AllocHGlobal(StructureSize)

这几天前被我这样缩短了

    Dim PUnmanagedDetailedInterfaceDataStructure As IntPtr = Marshal.AllocHGlobal(StructureSize)

第二次声明有什么问题?!

【讨论】:

    【解决方案2】:

    您需要使用 PipePolicyType.PIPE_TRANSFER_TIMEOUT 调用它

    Public Class Form1
        Public Sub SetPolicy(ByVal ep As Integer, ByVal PolicyType As PipePolicyType, ByVal PolicyValue As UInt32)
    
        End Sub
    
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    
            Dim a As UInt32 = 3000
    
            SetPolicy(1, PipePolicyType.PIPE_TRANSFER_TIMEOUT, a)
        End Sub
    End Class
    
    Public Enum PipePolicyType
        SHORT_PACKET_TERMINATE = 1
        AUTO_CLEAR_STALL = 2
        PIPE_TRANSFER_TIMEOUT = 3
        IGNORE_SHORT_PACKETS = 4
        ALLOW_PARTIAL_READS = 5
        AUTO_FLUSH = 6
        RAW_IO = 7
        RESET_PIPE_ON_RESUME = 9
    End Enum
    

    【讨论】:

    • 我标记为好,因为它是完美的,感谢您的努力。我完全在其他地方发现了问题(见下文)
    猜你喜欢
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多