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
из этого кода обратите внимание, но может показаться, что у вас недостаточно прав для того, что вы пытаетесь сделать.