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
4

1 回答 1

2

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

这么一说,-2147467259就有点蹊跷了。这不是 Win32 错误代码。那是一个 COM HRESULT。具体是0x80004005. 这是 Win32 周围的 COM 包装器ERROR_ACCESS_DENIED。不知道您在此代码中从哪里获得 COM HRESULT,但您似乎没有足够的权限来尝试您正在尝试的内容。

于 2013-12-10T11:54:05.383 回答