/ / CreateMsgQueueはWin32Error -2147467259で失敗する - vb.net、winapi、compact-framework、windows-ce、compact-framework2.0

Win32Error -2147467259でCreateMsgQueueが失敗する - vb.net、winapi、compact-framework、windows-ce、compact-framework2.0

私はいくつかの OpenNetCF コンポーネントのような パワー管理 そして DeviceStatusMonitor。しかし、彼らは決して事態を起こさなかったので、私は何かが間違っていると思った。私の最初の考えは、 P2PMessageQueue 彼らはどちらも両方に依存しています。そして、BAM、 CreateMsgQueue 返品 IntPtr.Zero。最後のWin32Errorをチェックすると、値-2147467259(マイナス)のエラーコードが返されます。

これはヒントを提供しない一般的なエラーコードですか?

どんな助けもありがとう。

(FYI: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は1

lpOptions パラメータが正しく宣言されていません。あなたはそれを ByVal しかしそれはすべきです ByRef.

それは、 -2147467259 奇妙なことです。それはWin32エラーコードではありません。それはCOMです HRESULT。具体的には、 0x80004005。どのWin32の周りのCOMラッパーです ERROR_ACCESS_DENIED。あなたはCOMを取得するか分からない HRESULT このコードの心の中から、あなたが試みていることに対して十分な権利を持っていないように見えます。