CreateMsgQueue завершается ошибкой с 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

1 ответ

Решение

lpOptions параметр объявлен неправильно. Вы объявляете это как ByVal но это должно быть ByRef,

Это сказало, -2147467259 это немного странно. Это не код ошибки Win32. Это COM HRESULT, Конкретно это 0x80004005, Какая оболочка COM вокруг Win32 ERROR_ACCESS_DENIED, Не уверен, где вы получите COM HRESULT из этого кода обратите внимание, но может показаться, что у вас недостаточно прав для того, что вы пытаетесь сделать.

Другие вопросы по тегам