0

我重新創建了一些OpenNetCF組件,如PowerManagementDeviceStatusMonitor。但由於他們從未提出過任何事件,我懷疑有些事情是錯誤的。我的第一個想法是檢查他們都依賴的P2PMessageQueue。然後BAM,CreateMsgQueue返回IntPtr.Zero。檢查最後一個Win32Error會給我一個值爲-2147467259(減號)的錯誤代碼。CreateMsgQueue 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

出於好奇,你爲什麼重新創建它們? – ctacke

回答

1

lpOptions參數聲明不正確。您聲明它爲ByVal但它應該是ByRef

也就是說,-2147467259是有點古怪。這不是一個Win32錯誤代碼。這是一個COM HRESULT。具體來說是0x80004005。這是Win32 ERROR_ACCESS_DENIED的COM封裝。不知道你從這個代碼中得到COM HRESULT的位置,但是看起來你沒有足夠的權利來支持你正在嘗試的東西。

+0

你絕對正確,非常感謝!從* ByVal *更改爲* ByRef *修復了問題。在OpenNetCF中,MSGQUEUEOPTIONS是一個類,不像我所做的那樣是一個結構。 –

+0

將它聲明爲一個類也是一個好方法。它允許你傳遞'null'。就我個人而言,我傾向於爲我的p /調用翻譯C++結構。 –

+0

這是一個很好的觀點。從現在開始我會記住這一點。 –