0

구성 요소 중 일부 (예 : PowerManagementDeviceStatusMonitor)를 다시 만들었습니다. 그러나 그들은 결코 어떤 사건도 제기하지 않았기 때문에 나는 무엇인가가 잘못되었다고 의심했다. 내 첫 번째 생각은 모두에 달려있는 P2PMessageQueue을 확인하는 것이 었습니다. 그런 다음 BAM, CreateMsgQueueIntPtr.Zero을 반환합니다. 마지막 Win32Error를 확인하면 -2147467259 (빼기) 값의 오류 코드가 나타납니다.CreateMsgQueue가 Win32Error와 함께 실패합니다. -2147467259

힌트를 제공하지 않는 일반적인 오류 코드일까요?

도움을 주시면 감사하겠습니다. lpOptions 매개 변수가 잘못 선언

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

:

(주춤함 5.0, CF 2.0 참고). ByVal으로 선언했지만 ByRef이어야합니다.

즉, -2147467259은 조금 이상합니다. 그것은 Win32 오류 코드가 아닙니다. COM HRESULT입니다. 특히 0x80004005입니다. 어느 Win32 ERROR_ACCESS_DENIED 주위의 COM 래퍼입니다. 이 코드에서 COM HRESULT의 정보를 얻지 못했지만 시도하고있는 것에 대한 충분한 권한이없는 것으로 보입니다.

+0

당신은 정말 옳습니다, 많은 감사합니다! * ByVal *에서 * ByRef *로 변경하면 문제가 해결되었습니다. OpenNetCF에서 MSGQUEUEOPTIONS 클래스는 내가 한 것처럼 구조체가 아닙니다. –

+0

클래스로 선언하는 것도 좋은 방법입니다. 'null '을 넘겨 줄 수 있습니다. 개인적으로 그것이 내 p/invokes에 대해 C++ 구조체를 번역하는 경향이 있습니다. –

+0

좋은 지적입니다. 앞으로도이 사실을 염두에 두겠습니다. –