CreateMsgQueue失败,Win32Error为-2147467259

时间:2013-12-10 11:37:15

标签: vb.net winapi compact-framework windows-ce compact-framework2.0

我重新创建了一些OpenNetCF组件,例如PowerManagementDeviceStatusMonitor。但由于他们从未提出任何事件,我怀疑有些事情是错的。我的第一个想法是检查他们都依赖的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

1 个答案:

答案 0 :(得分:2)

lpOptions参数声明不正确。您将其声明为ByVal,但它应为ByRef

那就是说,-2147467259有点奇怪。这不是Win32错误代码。这是一个COM HRESULT。具体来说就是0x80004005。哪个是Win32 ERROR_ACCESS_DENIED周围的COM包装器。不知道你在这段代码中从哪里得到COM HRESULT,但是看起来你没有足够的权利来处理你正在尝试的东西。