我重新创建了一些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
答案 0 :(得分:2)
lpOptions
参数声明不正确。您将其声明为ByVal
,但它应为ByRef
。
那就是说,-2147467259
有点奇怪。这不是Win32错误代码。这是一个COM HRESULT
。具体来说就是0x80004005
。哪个是Win32 ERROR_ACCESS_DENIED
周围的COM包装器。不知道你在这段代码中从哪里得到COM HRESULT
,但是看起来你没有足够的权利来处理你正在尝试的东西。