2013-07-01 4 views
1

TrackPopupMenu 함수를 호출하여 관리되는 VB.NET 코드에서 런타임에 메뉴를 표시하려고합니다. 의 PInvoke 기능 를 호출 불균형 스택을 가지고 'UeWIPopupX.mDeclares :: TrackPopupMenu UeWIPopupX!'PInvokeStackImbalance는 메시지를 검출되었다관리되는 vb.net 코드에서 TrackPopupMenu 함수를 호출하는 방법

: 다음은 내가 점점 오전 오류입니다. 관리되는 PInvoke 서명이 과 관리되지 않는 대상 서명이 일치하지 않기 때문일 수 있습니다. 호출 규칙과 PInvoke 서명의 매개 변수가 대상 관리되지 않는 서명과 일치하는지 확인하십시오. 사각형 RECT에 대한 선언 아래

dim lpRc as RECT 
Dim tP As POINTAPI 
Dim lR as Integer 
Dim lUn as Integer 

lUn = TPM_RIGHTBUTTON Or TPM_TOPALIGN Or TPM_LEFTALIGN Or TPM_RETURNCMD 
    tP.x = 50 
    tP.y = 100 
'Here I am getting the error 
lR = TrackPopupMenu(m_ppMenu.Tools(1).hMenu, lUn, tP.x, tP.y, 0, m_hWndOwner, lpRC) 

됩니다 : 아래

<DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True, CallingConvention:=CallingConvention.StdCall)> _ 
Friend Function TrackPopupMenu(ByVal hMenu As Long, ByVal wFlags As Integer, ByVal x As Integer, ByVal y As Integer, ByVal nReserved As Integer, ByVal hWnd As IntPtr, ByVal lprc As RECT) As Integer 

End Function 

TrackPopupMenu 함수를 호출하는 코드입니다 : 아래

내가 TrackPopupMenu 기능을 위해 사용하고있는 선언이다

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _ 
Structure RECT 
    Dim Left As Integer 
    Dim Top As Integer 
    Dim Right As Integer 
    Dim Bottom As Integer 
End Structure 

TrackPopupMenu를 호출하는 동안의 모든 인수에는 일부 값이 있습니다. 다른 callingConvention를 시도했지만 여전히 오류가 발생했습니다.

이 문제를 해결할 수 없습니다. 누구든지이 문제를 해결하는 방법을 알고 있습니까?

답변

1

신고가 잘못되었습니다. 첫 번째 인수는 메뉴에 대한 핸들이므로 IntPtr이어야합니다. 마지막 인수는 포인터에서 RECT입니다. VB.NET의 ByRef. 실제로 사용되지 않으므로 ByVal IntPtr을 선언하는 것이 좋습니다. 따라서 RECT 선언이 필요하지 않습니다. 귀하의 통화에서 IntPtr.Zero를 전달하십시오. 반환 값은 Integer가 아니라 Boolean입니다. false 반환을 얻으면 Win32Exception을 던집니다. 수정 :

당신이 인수 유형으로 긴 해낸 상상하기 힘든 메뉴 권리를 못해서 몇 가지 힌트가 있습니다
<DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _ 
Friend Function TrackPopupMenu(ByVal hMenu As IntPtr, ByVal wFlags As Integer, _ 
    ByVal x As Integer, ByVal y As Integer, ByVal nReserved As Integer, _ 
    ByVal hWnd As IntPtr, ByVal ignored As IntPtr) As Boolean 
End Function 

. 이 함수는 .NET에서 이미 포장되어 있으며, 극히 드문 경우 여야합니다. TrackPopupMenu는 .NET ContextMenu 클래스에 의해 이미 호출되었습니다. ContextMenuStrip 클래스는 더 나은 렌더링 옵션을 사용하여 최신 버전을 제공합니다.

관련 문제