CreateMsgQueue fails with Win32Error语言 - 2147467259



我重新创建了一些OpenNetCF组件,如PowerManagement和DeviceStatusMonitor。但由于他们从未提出任何事件,我怀疑出了什么问题。我的第一个想法是检查它们都依赖的P2PMessageQueue。然后BAM,CreateMsgQueue返回IntPtr.Zero。检查最后一个Win32Error会给我一个值为2147467259(减去)的错误代码。

这只是另一个没有提供任何提示的通用错误代码吗?

如有任何帮助,我们将不胜感激。

(仅供参考:WinCE 5.0、CF 2.0)

Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Try
            Dim lpName As String = "MyQueue"
            Dim lpOptions As MSGQUEUEOPTIONS = New MSGQUEUEOPTIONS()
            Dim hMsgQ As IntPtr = IntPtr.Zero
            lpOptions.bReadAccess = True
            lpOptions.dwMaxMessages = 0
            lpOptions.cbMaxMessage = &H1000
            lpOptions.dwFlags = MSGQUEUE_ALLOW_BROKEN
            lpOptions.dwSize = Marshal.SizeOf(lpOptions)
            hMsgQ = CreateMsgQueue(lpName, lpOptions)
            If (hMsgQ = IntPtr.Zero) Then
                Throw New Win32Exception(Marshal.GetLastWin32Error())
            Else
                CloseMsgQueue(hMsgQ)
            End If
        Catch ex As Win32Exception
            MessageBox.Show(String.Format(String.Format("Win32Exception: {0}", ex.ErrorCode)))
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub
    <DllImport("coredll.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
    Private Shared Function CloseMsgQueue(ByVal hMsgQ As IntPtr) As Boolean
    End Function
    <DllImport("coredll.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
    Private Shared Function CreateMsgQueue(<MarshalAs(UnmanagedType.LPWStr)> ByVal lpName As String, ByVal lpOptions As MSGQUEUEOPTIONS) As IntPtr
    End Function
    <StructLayout(LayoutKind.Sequential)> _
    Private Structure MSGQUEUEOPTIONS
        Public dwSize As Integer
        Public dwFlags As Integer
        Public dwMaxMessages As Integer
        Public cbMaxMessage As Integer
        Public bReadAccess As Boolean
    End Structure
    Private Const MSGQUEUE_ALLOW_BROKEN As Integer = 2
    Private Const MSGQUEUE_NOPRECOMMIT As Integer = 1
    Private Const MSGQUEUE_MSGALERT As Integer = 1
End Class

lpOptions参数声明错误。您声明它为ByVal,但它应该是ByRef

也就是说,-2147467259有点奇怪。这不是Win32错误代码。这是COM HRESULT。特别是0x80004005。它是Win32 ERROR_ACCESS_DENIED的COM包装器。请注意,不确定您在该代码中从何处获得COM HRESULT,但您似乎没有足够的权限进行尝试。

相关内容

  • 没有找到相关文章

最新更新